凤凰频道的广播如何影响其他节点上的客户端?
Posted
技术标签:
【中文标题】凤凰频道的广播如何影响其他节点上的客户端?【英文标题】:How does broadcasting from a Phoenix Channel hit clients on other nodes? 【发布时间】:2016-03-19 10:49:18 【问题描述】:在使用 WebSockets 时,我正在尝试将 Phoenix Channels 与新的 Rails ActionCable 进行比较。
在某些情况下,ActionCable 在向所有客户端广播消息时使用 Redis 来处理 PubSub。示例场景:单独节点上的 3 个 rails 进程中的 1 个将能够向连接在所有 Web 服务器上的客户端广播。这是通过点击 Redis 来完成的,Redis 依次发布到所有 rails 服务器,然后推送到所有连接的客户端。
我最近读到了2 million websocket connections achieved by Phoenix websocket 连接。
还发现了这个宝石: Phoenix 1.0 发行说明中提到了有关频道的内容:
即使是在一组机器上,您的消息也会被广播 节点自动
Phoenix 如何跨节点向客户端广播?它是否在后台使用邮箱和/或其他一些进程间通信?
这类似于post中的问题2)。
谢谢!
【问题讨论】:
【参考方案1】: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 详细信息和节点节点通信完全由运行时处理。
【讨论】:
谢谢!这一切听起来都很棒。我很好奇网络服务器如何相互了解以启用对等广播,但我会将其保存为我自己的研究。这个模型似乎也适用于工作队列。真正的phoenix 后台worker 框架不会像sidekiq 或exq 那样使用redis,但会使用这种方法。 这是给下一位路过的读者的。每个节点(在本例中为 Web 服务器)都知道如何与其他节点通信,因为它们将应用程序部署为分布式系统。点击以下链接了解更多详情:benjamintan.io/blog/2014/05/25/… 感谢克里斯的解释。我正在检查pg2
文档,似乎计划在OTP 24 中删除,并引入pg
替换,它对Phoenix 有影响吗? erlang.org/doc/man/pg2.html以上是关于凤凰频道的广播如何影响其他节点上的客户端?的主要内容,如果未能解决你的问题,请参考以下文章