在使用WebSockets时,我正在尝试将Phoenix Channels与新的Rails ActionCable进行比较.
对于某些上下文,ActionCable在向所有客户端广播消息时使用Redis来处理PubSub.示例场景:单独节点上的3个rails进程中的1个将能够广播到所有Web服务器上连接的客户端.这是通过点击Redis完成的,Redis又发布到所有rails服务器,然后推送到所有连接的客户端.
我最近读到了关于Phoenix websocket连接实现的200万个 websocket连接.
还发现了这个宝石:Phoenix 1.0发行说明提到了有关频道的信息:
即使在一组计算机上,您的消息也会自动在节点间广播
Phoenix如何能够跨节点向客户端广播?它是否在引擎盖下使用邮箱和/或其他一些进程间通信?
这类似于在这个问题2)职位.
谢谢!
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细节和节点< - >节点通信完全由运行时处理.