2015-12-14 4 views
7

Я пытаюсь сравнить каналы Phoenix с новым Rails ActionCable, когда дело доходит до работы с WebSockets.Каким образом трансляция с канала Phoenix ударила клиентов по другим узлам?

В некоторых случаях ActionCable использует Redis для обработки PubSub при передаче сообщения всем клиентам. Пример сценария: 1 из 3 процессов rails на отдельном узле будет иметь возможность транслировать на клиентов, подключенных на всех веб-серверах. Это делается ударом Redis, который, в свою очередь, публикует все серверы rails, которые затем нажимают на всех своих подключенных клиентов.

Я недавно прочитал о подключениях в сети 2 million websocket connections achieved by Phoenix.

Также нашел эту перл: Примечания к выпуску Phoenix 1.0 упоминает об этом в отношении каналов:

Даже на кластере машин, ваши сообщения транслируются через узлы автоматически

Как Phoenix может транслировать клиентов через узлы? Используется ли почтовый ящик и/или какая-либо другая межпроцессная связь под капотом?

Это похоже на вопрос 2) в этом post.

Спасибо!

ответ

13

Уровень PubSub Phoenix реализован исключительно со стандартной библиотекой. Модель параллелизма Erlang VM распределена из коробки. Таким образом, модель почтовых ящиков/сообщений просто работает, вы отправляете сообщение локально send(some_local_pid, :a_message) или глобально send(some_pid_on_another_machine, :a_message). Это одна из удивительных вещей об Эликсире и Эрланге, которая позволяет Фениксу проливать зависимости, такие как Редис. Если вам интересно, как система PubSub Феникса использует эти функции в ее реализации, см этот блог:

http://www.zohaib.me/guts-of-phoenix-channels/?utm_campaign=elixir_radar_28&utm_medium=email&utm_source=RD+Station

tldr; мы используем локальные таблицы ETS для хранения подписки PubSub для процессов, локальных для узла, и мы передаем их через узлы, используя одну группу :pg2, членом которой является каждый сервер PubSub.Local. Когда сервер PubSub.Local получает широковещательную передачу, он отправляет сообщение всем абонентам локально, просматривая местные подписки ETS. Фактические данные IPC и узел < -> узловая связь полностью обрабатываются средой выполнения.

+0

Спасибо! Все это звучит великолепно. Мне любопытно, как веб-серверы знают друг о друге, чтобы включить одноранговую трансляцию, но я сохраню это для своих собственных исследований. Похоже, эта модель также применима для рабочей очереди. Настоящая фреймворческая фреймворческая фреймворк не будет использовать redis, например sidekiq или [exq] (https://github.com/akira/exq), но будет использовать этот подход. – dimroc

+1

Это для следующего прохода читателя. Каждый узел (в данном случае веб-сервер) знает, как взаимодействовать с другими узлами, потому что они развернули приложение как распределенную систему. Нажмите ссылку ниже для получения более подробной информации: http://benjamintan.io/blog/2014/05/25/connecting-elixir-nodes-on-the-same-lan/ – dimroc

 Смежные вопросы

  • Нет связанных вопросов^_^