来自 Phoenix Channel 的广播如何影响其他节点上的客户端?

How does broadcasting from a Phoenix Channel hit clients on other nodes?

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

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

我最近了解到 2 million websocket connections achieved by Phoenix websocket 连接。

还发现了这个 gem: Phoenix 1.0 发行说明提到了有关渠道的这一点:

Even on a cluster of machines, your messages are broadcasted across the nodes automatically

Phoenix 如何跨节点向客户端广播?它是否在幕后使用邮箱 and/or 一些其他进程间通信?

这类似于中的问题2)。

谢谢!

Phoenix 的 PubSub 层是单独使用标准库实现的。 Erlang VM 的并发模型是开箱即用的。因此,无论您是在本地 send(some_local_pid, :a_message) 还是全局 send(some_pid_on_another_machine, :a_message) 发送消息,mailbox/messaging 模型都可以正常工作。这是 Elixir 和 Erlang 的惊人之处之一,它允许 Phoenix 像 Redis 一样摆脱依赖。如果您对 Phoenix 的 PubSub 系统如何在其实施中利用这些功能感到好奇,请参阅此博客 post:

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 细节和节点<->节点通信完全由运行时处理。