Несколько подписчиков с EM-WebSocket или Goliath
Поэтому я пытаюсь настроить em-websocket (или, возможно, Голиафа), чтобы пользователи могли перейти на другой маршрут и, таким образом, подписаться только на этот канал, например:
example.com/channel_1
Браузеры, открытые там, будут получать только сообщения, опубликованные на channel_1
На самом деле до этого момента это не должен быть маршрут, подобный этому, я бы согласился на использование параметров. Поэтому я использую AMQP, и у него есть понятие прямого обмена и ключей маршрутизации. Есть ли что-то аналогичное этому с веб-сокетами?
У меня работает сервер Голиафа, но проблема в том, что, поскольку он использует общие конечные точки, я думаю, что все браузеры, открытые с подключением через веб-сокет, получают одинаковые сообщения, вот что я делаю:
channel.queue(params['channel'], :auto_delete => true).subscribe do |payload|
config['channel'].push(payload)
end
Так что в этом примере используется AMQP, который я все еще хотел бы использовать, но проблема, на мой взгляд, заключается в том, что каждый клиент переосмысливает EM::Channel.new
и затем сообщения отправляются на этот канал, я просто не понимаю, как бы я подписал несколько клиентов на разные каналы.
Любая помощь в понимании этого или приведение меня к более подходящей схеме проектирования.
1 ответ
Если ваши каналы предварительно определены, вы можете просто сделать EM::Channel.new в файле конфигурации для вашего сервера для каждого из каналов, тогда клиенты будут отправлять / получать сообщения через соответствующий канал.
Если каналы определены пользователями, то вам нужно настроить хеш (или что-то) в вашей конфигурации, который будет хранить ваши каналы, когда клиент подключается, проверьте хеш конфигурации, чтобы увидеть, существует ли канал, если он не 't, EM::Channel.new это и продолжить. Если он существует, используйте существующий канал.
Во втором случае вам нужно будет выполнить некоторую логику при отключении клиента, чтобы иметь дело с отключением канала, когда все клиенты пропали, или у вас будет утечка памяти.