9

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

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

我最近读到了Phoenix websocket 连接实现的 200 万个 websocket 连接。

还发现了这个 gem:Phoenix 1.0 发行说明提到了有关频道的内容:

即使在机器集群上,您的消息也会自动跨节点广播

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

这类似于本文中的问题 2 )

谢谢!

4

1 回答 1

16

Phoenix 的 PubSub 层仅使用标准库实现。Erlang VM 的并发模型是开箱即用的。send(some_local_pid, :a_message)因此,无论您是在本地还是在全球范围内发送消息,邮箱/消息模型都可以正常工作send(some_pid_on_another_machine, :a_message)。这是关于 Elixir 和 Erlang 的令人惊奇的事情之一,它允许 Phoenix 摆脱像 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 详细信息和节点<->节点通信完全由运行时处理。

于 2015-12-14T03:33:46.477 回答