凤凰频道的广播如何影响其他节点上的客户端?

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

以上是关于凤凰频道的广播如何影响其他节点上的客户端?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用频道广播消息

无法广播客户端事件(连接未订阅频道私聊)

为啥 laravel 广播频道有默认前缀?

Laravel 使用 Socket.io 广播到私人频道

BLE:广播channel上的PDU分析

一个基于TCP/IP的小项目,实现广播消息的功能。(超详细版)