class ActionCable::Server::Base
Сервер Action Cable (базовый класс)
Экземпляр синглтона ActionCable::Server доступен через ActionCable.server. Он используется процессом Rack, который запускает сервер Action Cable, но также используется пользователем для доступа к объекту RemoteConnections, который используется для поиска и отключения соединений на всех серверах.
Кроме того, это экземпляр сервера, используемый для трансляции. Подробнее см. Broadcasting.
Атрибуты
Публичные методы класса
# File actioncable/lib/action_cable/server/base.rb, line 21 def self.logger; config.logger; end
# File actioncable/lib/action_cable/server/base.rb, line 26 def initialize(config: self.class.config) @config = config @mutex = Monitor.new @remote_connections = @event_loop = @worker_pool = @pubsub = nil end
Публичные методы экземпляра
# File actioncable/lib/action_cable/server/base.rb, line 33 def call(env) return config.health_check_application.call(env) if env["PATH_INFO"] == config.health_check_path setup_heartbeat_timer config.connection_class.call.new(self, env).process end
Вызывается Rack для настройки сервера.
# File actioncable/lib/action_cable/server/base.rb, line 90 def connection_identifiers config.connection_class.call.identifiers end
Все идентификаторы, применённые к классу соединения, связанному с этим сервером.
# File actioncable/lib/action_cable/server/base.rb, line 40 def disconnect(identifiers) remote_connections.where(identifiers).disconnect end
Отключение всех соединений, идентифицированных по identifiers на этом сервере или на других через RemoteConnections.
# File actioncable/lib/action_cable/server/base.rb, line 65
def event_loop
@event_loop || @mutex.synchronize { @event_loop ||= ActionCable::Connection::StreamEventLoop.new }
end # File actioncable/lib/action_cable/server/base.rb, line 85
def pubsub
@pubsub || @mutex.synchronize { @pubsub ||= config.pubsub_adapter.new(self) }
end Адаптер, используемый для всех потоков/трансляций.
# File actioncable/lib/action_cable/server/base.rb, line 61
def remote_connections
@remote_connections || @mutex.synchronize { @remote_connections ||= RemoteConnections.new(self) }
end Вспомогательный класс для RemoteConnections. Подробнее см. этот класс.
# File actioncable/lib/action_cable/server/base.rb, line 44
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 # File actioncable/lib/action_cable/server/base.rb, line 80
def worker_pool
@worker_pool || @mutex.synchronize { @worker_pool ||= ActionCable::Server::Worker.new(max_size: config.worker_pool_size) }
end Пул потоков (worker pool), в котором выполняются обратные вызовы подключения и действия канала. Вся работа выполняется в минимальной степени на основном потоке сервера. Worker pool — это служба исполнителя, которая подкрепляется пулом потоков, работающих из очереди задач. Размер пула потоков по умолчанию составляет 4 рабочих потока. Вы можете настроить размер с помощью config.action_cable.worker_pool_size.
Использование Active Record, Redis и т. п. в действиях канала означает, что для каждого потока в worker pool будет создано отдельное соединение. Соответствующим образом спланируйте свою развертку: 5 серверов, каждый из которых работает с 5 процессами Puma, каждый с 8-поточным worker pool, означает, что вам потребуется как минимум 200 подключений к базе данных.
Также убедитесь, что размер пула подключений к базе данных не меньше, чем размер worker pool. В противном случае потоки могут перегрузить пул подключений к базе данных, и они будут блокироваться, ожидая, пока другие потоки освободят свои подключения. Вместо этого используйте меньший worker pool или больший пул подключений к базе данных.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.