Phoenix Channel的广播如何击中其他节点上的客户端?

时间:2015-12-14 02:22:57

标签: elixir phoenix-framework actioncable

在使用WebSockets时,我正在尝试将Phoenix Channels与新的Rails ActionCable进行比较。

对于某些上下文,ActionCable在向所有客户端广播消息时使用Redis来处理PubSub。示例场景:单独节点上的3个rails进程中的1个将能够广播到连接在所有Web服务器上的客户端。这是通过点击Redis完成的,Redis又发布到所有铁路服务器,然后推送到所有连接的客户端。

我最近阅读了2 million websocket connections achieved by Phoenix websocket连接。

还找到了这个宝石: Phoenix 1.0发行说明提到了有关频道的信息:

  

即使在群集的计算机上,您的消息也会被广播   节点自动

Phoenix如何能够跨节点向客户端广播?它是否在引擎盖下使用邮箱和/或其他一些进程间通信?

这与post中的问题2)类似。

谢谢!

1 个答案:

答案 0 :(得分:14)

Phoenix的PubSub图层仅使用标准库实现。 Erlang VM的并发模型开箱即用。因此,邮箱/消息传递模型Just Works是您在本地send(some_local_pid, :a_message)或全局send(some_pid_on_another_machine, :a_message)发送消息。这是关于Elixir和Erlang的令人惊奇的事情之一,它允许凤凰城摆脱像Redis这样的依赖。如果您对Phoenix的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细节和节点< - >节点通信完全由运行时处理。