Class: ActionCable::Server::Base

Inherits:
Object
  • Object
show all
Includes:
Broadcasting, Connections
Defined in:
actioncable/lib/action_cable/server/base.rb

Overview

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

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

Constant Summary

Constants included from Connections

Connections::BEAT_INTERVAL

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Connections

#add_connection, #connections, #open_connections_statistics, #remove_connection, #setup_heartbeat_timer

Methods included from Broadcasting

#broadcast, #broadcaster_for

Constructor Details

#initializeBase


20
21
22
23
# File 'actioncable/lib/action_cable/server/base.rb', line 20

def initialize
  @mutex = Monitor.new
  @remote_connections = @event_loop = @worker_pool = @pubsub = nil
end

Instance Attribute Details

#mutexObject (readonly)

Returns the value of attribute mutex


18
19
20
# File 'actioncable/lib/action_cable/server/base.rb', line 18

def mutex
  @mutex
end

Class Method Details

.loggerObject


15
# File 'actioncable/lib/action_cable/server/base.rb', line 15

def self.logger; config.logger; end

Instance Method Details

#call(env) ⇒ Object

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


26
27
28
29
# File 'actioncable/lib/action_cable/server/base.rb', line 26

def call(env)
  setup_heartbeat_timer
  config.connection_class.call.new(self, env).process
end

#connection_identifiersObject

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


80
81
82
# File 'actioncable/lib/action_cable/server/base.rb', line 80

def connection_identifiers
  config.connection_class.call.identifiers
end

#disconnect(identifiers) ⇒ Object

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


32
33
34
# File 'actioncable/lib/action_cable/server/base.rb', line 32

def disconnect(identifiers)
  remote_connections.where(identifiers).disconnect
end

#event_loopObject


55
56
57
# File 'actioncable/lib/action_cable/server/base.rb', line 55

def event_loop
  @event_loop || @mutex.synchronize { @event_loop ||= config.event_loop_class.new }
end

#pubsubObject

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


75
76
77
# File 'actioncable/lib/action_cable/server/base.rb', line 75

def pubsub
  @pubsub || @mutex.synchronize { @pubsub ||= config.pubsub_adapter.new(self) }
end

#remote_connectionsObject

Шлюз для RemoteConnections. Посмотите на этот класс для получения подробностей.


51
52
53
# File 'actioncable/lib/action_cable/server/base.rb', line 51

def remote_connections
  @remote_connections || @mutex.synchronize { @remote_connections ||= RemoteConnections.new(self) }
end

#restartObject


36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'actioncable/lib/action_cable/server/base.rb', line 36

def restart
  connections.each(&:close)

  @mutex.synchronize do
    # Завершение работы пула воркеров
    @worker_pool.halt if @worker_pool
    @worker_pool = nil

    # Завершение работы pub/sub адаптера
    @pubsub.shutdown if @pubsub
    @pubsub = nil
  end
end

#worker_poolObject

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

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

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


70
71
72
# File 'actioncable/lib/action_cable/server/base.rb', line 70

def worker_pool
  @worker_pool || @mutex.synchronize { @worker_pool ||= ActionCable::Server::Worker.new(max_size: config.worker_pool_size) }
end