websocket - 仅针对使用 channel 而定制的 Phoenix 应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?

标签 websocket socket.io publish-subscribe elixir phoenix-framework

我将节点应用程序纯粹用于 Redis PubSub 的 socket.io channel ,目前我将其分布在 3 台机器上,并由其中一台机器上的 nginx 负载平衡支持。

我想用 Phoenix 应用程序替换这个节点应用程序,而且我对 erlang/Elixir 世界还是个新手,所以我仍然没有弄清楚单个 Phoenix 应用程序如何跨越一台以上的机器。谷歌搜索所有可能的扩展和负载平衡术语没有任何结果。

1.0 release notes关于 channel ,请提及这一点:

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

1)所以我基本上将我的应用程序部署到N台服务器,在每台服务器中启动Cowboy服务器,类似于我对节点的处理方式,我将它们与nginx/HAProxy联系起来

2) 如果是这种情况,如何按照发行说明中所述在所有节点上广播 channel 消息?

编辑3:获取Theston答案澄清了不存在 Phoenix 应用程序,而是 Elixir/Erlang 应用程序,我更新了搜索词并发现了一些有关扩展和负载平衡的有趣结果。

编辑 2:从 Elixir's creator 找到此内容:

Elixir provides conveniences for process grouping and global processes (shared between nodes) but you can still use external libraries like Consul or Zookeeper for service discovery or rely on HAProxy for load balancing for the HTTP based frontends.

已编辑:Connecting Elixir nodes on the same LAN是第一个提到 Elixir 间通信的文章,但与 Phoenix 本身无关,并且不清楚它与负载平衡以及每个 Phoenix 节点之间的通信有何关系。

最佳答案

Phoenix 不是应用程序,当您生成 Phoenix 项目时,您创建了一个 Elixir 应用程序,Phoenix 只是一个依赖项(实际上是一堆使构建应用程序的 Web 部分变得更容易的东西)。

因此,您需要执行的任何节点分发仍然可以在您的 Elixir 应用程序中进行。

您可以仅使用 Phoenix 进行 Web 路由,然后将数据传递到底层 Elixir 应用程序以处理跨节点的分发。

值得一读http://www.phoenixframework.org/v1.0.0/docs/channels (如果您还没有)它解释了 Phoenix channel 如何使用 PubSub 进行分发(可以配置为使用不同的适配器)。

此外,您是否通过运行 mix phoenix.server 在部署服务器上旋转牛仔?

如果是这样,那么我建议查看 EXRM https://github.com/bitwalker/exrm

这会将您的 Elixir 应用程序捆绑到一个独立的文件中,您可以轻松地将其部署到生产服务器(如果您愿意,可以使用 Capistrano),然后启动您的应用程序。

这也意味着您也不需要在生产计算机上安装任何 Erlang/Elixir 依赖项。

简而言之,Phoenix 与 Rails 不同,Phoenix 不是应用程序,也不是堆栈。它只是一个为您的 Elixir 应用程序提供有用功能的依赖项。

关于websocket - 仅针对使用 channel 而定制的 Phoenix 应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028965/

相关文章:

c# - ASP.NET 核心 WebSocket

node.js - NodeJS 网络套接字服务器在大约 1,000 个连接时爆炸

node.js - 如何将 swift 应用程序连接到套接字 io 服务器

javascript - socket.io——限制每个命名空间的最大连接数

c# - 为什么 C# EventHandler 等于 MSN 示例中的事件?

python - 我在 "TypeError: str() takes at most 1 argument (2 given)"变量处收到此错误 "client_response"

django - 无法通过 group_send 向 Django channel 发送消息

html - 将 mysql 数据库打印到 socket.io 和 node.js 中的 html 页面

java - 发布/订阅中间件

android - Google Cloud Messaging 适用于发布/订阅位置系统