2015-12-14 10 views
7

Próbuję porównać kanały Phoenix z nowym Rails ActionCable, jeśli chodzi o pracę z WebSockets.W jaki sposób nadawanie z kanału Phoenix wpływa na klientów w innych węzłach?

Dla niektórych kontekstów, ActionCable wykorzystuje Redis do obsługi PubSub podczas nadawania komunikatu wszystkim klientom. Przykładowy scenariusz: 1 z 3 procesów szyny na oddzielnym węźle będzie mógł nadawać do klientów połączonych na wszystkich serwerach internetowych. Odbywa się to poprzez naciśnięcie przycisku Redis, który z kolei publikuje wszystkie serwery railsowe, które następnie przesyłają do wszystkich podłączonych klientów.

Ostatnio czytałem o połączeniach sieciowych 2 million websocket connections achieved by Phoenix.

Także ten klejnot: The Phoenix 1.0 Release Notes wspomnieć o tym dotyczące kanały:

Nawet na klastrze maszyn, wiadomości są nadawane w poprzek węzły automatycznie

Jak Phoenix może transmitować do klientów w węzłach? Czy używa on skrzynek pocztowych i/lub innej komunikacji międzyprocesowej pod maską?

Jest to podobne do pytania 2) w tym post.

Dzięki!

Odpowiedz

13

Warstwa PubSub Phoenix jest zaimplementowana wyłącznie z biblioteką standardową. Model współbieżności maszyny Erlang VM jest rozprowadzany po wyjęciu z pudełka. Tak więc model skrzynki pocztowej/przesyłania wiadomości Just Works wysyła wiadomość lokalnie pod numer send(some_local_pid, :a_message) lub globalnie send(some_pid_on_another_machine, :a_message). Jest to jedna z niesamowitych rzeczy o Elixir i Erlang, które pozwalają Phoenixowi pozbyć się zależności takich jak Redis. Jeśli jesteś ciekaw, jak układ Phoenixa PubSub wykorzystuje te funkcje w jego realizacji, zobacz ten post na blogu:

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

tldr; używamy lokalnych tablic ETS do przechowywania subskrypcji PubSub dla procesów lokalnych do węzła, a my transmitujemy w węzłach za pomocą pojedynczej grupy :pg2, z której każdy serwer PubSub.Local jest członkiem. Gdy serwer PubSub.Local odbierze transmisję, przesyła wiadomość do wszystkich subskrybentów lokalnie, wyszukując lokalne subskrypcje ETS. Rzeczywiste szczegóły IPC i węzeł komunikacyjny węzła są obsługiwane w całości przez środowisko wykonawcze.

+0

Dzięki! To wszystko brzmi świetnie. Ciekawi mnie, jak serwery internetowe wiedzą o sobie nawzajem, aby umożliwić transmisję rówieśników, ale zachowam to dla własnych badań. Wygląda na to, że ten model będzie miał zastosowanie również w kolejce roboczej. Prawdziwy framework pracujący w tle phoenix nie używałby redis jak sidekiq lub [exq] (https://github.com/akira/exq), ale używałby tego podejścia. – dimroc

+1

To jest dla następnego czytelnika przechodzącego obok. Każdy węzeł (w tym przypadku serwer WWW) wie, jak komunikować się z innymi węzłami, ponieważ wdrożył aplikację jako system rozproszony. Kliknij poniższy link, aby uzyskać więcej informacji: http://benjamintan.io/blog/2014/05/25/connecting-elixir-nodes-on-the-same-lan/ – dimroc

Powiązane problemy