当涉及到使用Rails ActionCable时,我正在尝试将凤凰频道与新的WebSockets进行比较。
对于某些上下文,ActionCable在向所有客户端广播消息时使用Redis来处理PubSub。示例场景:一个单独节点上的3个rails进程中的一个将能够向连接在所有web服务器上的客户端广播。这是通过点击Redis来实现的,Redis反过来将发布到所有rails服务器,然后rails服务器推送到所有连接的客户端。
我最近读到了关于菲尼克斯实现了200万个websocket连接 websocket连接的文章。
还找到了这个宝石:菲尼克斯1.0发行说明提到了这个关于频道的内容:
即使在一组机器上,您的消息也会自动在节点上广播。
凤凰如何能够跨节点向客户广播?它是在使用邮箱和/或其他进程间通信吗?
这类似于帖子中的问题2)。
谢谢!
发布于 2015-12-14 03:33:46
菲尼克斯的PubSub层仅用标准库实现。Erlang的并发模型是按箱外分发的。因此,邮箱/消息传递模型只适用于您是在本地send(some_local_pid, :a_message)还是全局send(some_pid_on_another_machine, :a_message)发送消息。这是关于Elixir和Erlang的奇妙之处之一,它允许菲尼克斯摆脱像Redis这样的依赖。如果您对菲尼克斯的PubSub系统如何在其实现中利用这些特性感到好奇,请参阅下面的博客文章:
source=RD+Station
tldr;我们使用本地ETS表来保存节点本地进程的PubSub订阅,并使用每个PubSub.Local服务器都是其成员的单个:pg2组跨节点进行广播。当PubSub.Local服务器接收到广播时,它通过查找本地ETS订阅将消息在本地转发给所有订阅者。实际的IPC详细信息和节点<->节点通信完全由运行时处理。
https://stackoverflow.com/questions/34258853
复制相似问题