在使用WebSockets时,我试图将Phoenix Channels与新的Rails ActionCable进行比较。
对于某些上下文,ActionCable在向所有客户端广播消息时使用Redis来处理PubSub。示例场景:一个单独节点上的三个rails进程中的一个将能够向连接在所有web服务器上的客户端广播。这是通过点击Redis来完成的,Redis反过来发布到所有rails服务器,然后推送到所有连接的客户端。
我最近读到关于Phoenix网络套接字连接实现的200万个网络套接字连接。
还发现了这颗宝石:Phoenix 1.0的发行说明提到了这一点,涉及频道:
即使在一组机器上,您的消息也会在节点自动
Phoenix如何能够跨节点向客户端广播?它是否在后台使用邮箱和/或其他进程间通信?
这与本文中的问题2)类似。
谢谢!
Phoenix的PubSub层仅使用标准库实现。Erlang虚拟机的并发模型是开箱即用的。因此,无论您是在本地send(some_local_pid, :a_message)
还是在全局send(some_pid_on_another_machine, :a_message)
发送邮件,邮箱/消息传递模型都能正常工作。这是关于长生不老药和二郎的惊人之处之一,它允许凤凰摆脱像Redis这样的依赖关系。如果你想知道Phoenix的PubSub系统是如何在实现中利用这些功能的,请参阅以下博客文章:
http://www.zohaib.me/guts-of-phoenix-channels/?utm_campaign=elixir_radar_28&utm_medium=电子邮件&utm_source=RD+车站
tldr;我们使用本地ETS表来保存节点本地进程的PubSub订阅,并且我们使用每个PubSub.Local
服务器都是其成员的单个:pg2
组在节点之间进行广播。当PubSub.Local
服务器接收到广播时,它通过查找本地ETS订阅将消息转发到本地的所有订户。实际IPC详细信息和节点<->节点通信完全由运行时处理。