在使用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)类似。
谢谢!
答案 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系统如何在其实施中利用这些功能感到好奇,请参阅此博客文章:
tldr;我们使用本地ETS表来保存节点本地进程的PubSub订阅,我们使用每个:pg2
服务器所属的PubSub.Local
组来跨节点进行广播。当PubSub.Local
服务器收到广播时,它会通过查找本地ETS订阅在本地将消息转发给所有订户。实际的IPC细节和节点< - >节点通信完全由运行时处理。