Spec-Zone.ru › Ruby on Rails 6.1

класс ActionCable::Server::Base

Родитель:
Объект
Включенные модули:
ActionCable::Server::Broadcasting

Экземпляр синглтона ActionCable::Server доступен через ActionCable.server. Он используется процессом Rack, который запускает сервер Action Cable, а также пользователем для доступа к объекту RemoteConnections, используемому для поиска и отключения подключений на всех серверах.

Кроме того, это экземпляр сервера, используемый для трансляции. Дополнительную информацию см. в Broadcasting.

Атрибуты

config[R]
mutex[R]

Общедоступные методы класса

logger() Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 19
def self.logger; config.logger; end
new(config: self.class.config) Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 24
def initialize(config: self.class.config)
  @config = config
  @mutex = Monitor.new
  @remote_connections = @event_loop = @worker_pool = @pubsub = nil
end

Общедоступные методы экземпляра

call(env) Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 31
def call(env)
  setup_heartbeat_timer
  config.connection_class.call.new(self, env).process
end

Вызывается Rack для настройки сервера.

connection_identifiers() Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 87
def connection_identifiers
  config.connection_class.call.identifiers
end

Все идентификаторы, примененные к классу подключения, связанному с этим сервером.

disconnect(identifiers) Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 37
def disconnect(identifiers)
  remote_connections.where(identifiers).disconnect
end

Отключить все подключения, идентифицированные по identifiers на этом сервере или других через RemoteConnections.

event_loop() Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 62
def event_loop
  @event_loop || @mutex.synchronize { @event_loop ||= ActionCable::Connection::StreamEventLoop.new }
end
pubsub() Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 82
def pubsub
  @pubsub || @mutex.synchronize { @pubsub ||= config.pubsub_adapter.new(self) }
end

Адаптер, используемый для всех потоков/трансляций.

remote_connections() Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 58
def remote_connections
  @remote_connections || @mutex.synchronize { @remote_connections ||= RemoteConnections.new(self) }
end

Шлюз к RemoteConnections. Подробности см. в этом классе.

restart() Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 41
def restart
  connections.each do |connection|
    connection.close(reason: ActionCable::INTERNAL[:disconnect_reasons][:server_restart])
  end

  @mutex.synchronize do
    # Shutdown the worker pool
    @worker_pool.halt if @worker_pool
    @worker_pool = nil

    # Shutdown the pub/sub adapter
    @pubsub.shutdown if @pubsub
    @pubsub = nil
  end
end
worker_pool() Показать исходный код
# File actioncable/lib/action_cable/server/base.rb, line 77
def worker_pool
  @worker_pool || @mutex.synchronize { @worker_pool ||= ActionCable::Server::Worker.new(max_size: config.worker_pool_size) }
end

В пуле рабочих потоков выполняются обратные вызовы подключения и действия канала. На основном потоке сервера выполняется как можно меньше действий. Пул рабочих потоков — это служба исполнителя, которая поддерживается пулом потоков, работающих из очереди задач. Размер пула потоков по умолчанию составляет 4 потока. Вы можете настроить размер самостоятельно с помощью config.action_cable.worker_pool_size.

Использование Active Record, Redis и т. п. в ваших действиях канала подразумевает, что каждый поток в пуле рабочих потоков будет иметь отдельное подключение. Планируйте развертывание соответственно: 5 серверов, на каждом из которых работает 5 Puma-рабочих процессов, на каждом из которых работает пул из 8 рабочих потоков, означает, что вам понадобится не менее 200 подключений к базе данных.

Кроме того, убедитесь, что размер пула подключений к базе данных не меньше размера пула рабочих потоков. В противном случае рабочие потоки могут перегрузить пул подключений к базе данных и заблокироваться, ожидая, пока другие рабочие потоки освободят свои подключения. Вместо этого используйте меньший пул рабочих потоков или больший пул подключений к базе данных.

© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API