一个 Phoenix 应用程序如何定制成只使用通道在多台机器上扩展?使用 HAProxy?如何向所有节点广播消息?
How can a Phoenix application tailored only to use channels scale on multiple machines? Using HAProxy? How to broadcast messages to all nodes?
我将节点应用程序纯粹用于 socket.io 通道与 Redis PubSub,目前我将它分布在 3 台机器上,其中一台机器上有 nginx 负载平衡支持。
我想用 Phoenix 应用程序替换这个节点应用程序,我对 erlang/Elixir 世界还是个新手,所以我仍然没有弄清楚单个 Phoenix 应用程序如何跨越超过一台机器。谷歌搜索所有可能的缩放和负载平衡术语一无所获。
1.0 release notes 就频道提到了这一点:
Even on a cluster of machines, your messages are broadcasted across the nodes automatically
1) 所以我基本上将我的应用程序部署到 N 个服务器,在每个服务器中启动 Cowboy 服务器,类似于我对 node 和我把它们绑起来 nginx/HAProxy?
2) 如果是这种情况,如何像发行说明中提到的那样在所有节点上广播频道消息?
编辑 3:采取 的回答澄清了没有 Phoenix 应用程序这样的东西,而是 Elixir/Erlang 应用程序,我更新了我的搜索词并发现了一些关于缩放和缩放的有趣结果负载均衡。
- 一本免费的内容丰富的书:Stuff Goes Bad: Erlang in Anger
- Erlang 池库 recommendations
编辑 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 应用程序部署到 > 1 台机器,并使用配置为将请求转发到众多应用程序机器之一的 Nginx 负载平衡器。
Erlang 的内置节点通信等用于以不同于 Web 应用程序的方式扩展的应用程序。例如,分布式数据库或队列。
Phoenix 不是应用程序,当您生成 Phoenix 项目时,您创建了一个 Elixir 应用程序,Phoenix 只是一个依赖项(实际上是一堆使构建应用程序的 Web 部分更容易的东西)。
因此,您需要执行的任何节点分发仍然可以在您的 Elixir 应用程序中进行。
您可以只使用 Phoenix 进行网络路由,然后将数据传递到您的底层 Elixir 应用程序以处理跨节点的分发。
值得一读 http://www.phoenixframework.org/v1.0.0/docs/channels(如果您还没有阅读的话),其中解释了 Phoenix 频道如何使用 PubSub 进行分发(可以配置为使用不同的适配器)。
此外,您是否通过 运行 mix phoenix.server 在部署服务器上启动 cowboy?
如果是这样,那么我建议查看 EXRM https://github.com/bitwalker/exrm
这会将您的 Elixir 应用程序捆绑到一个独立的文件中,您可以简单地将其部署到您的生产服务器(如果您愿意,可以使用 Capistrano),然后启动您的应用程序。
这也意味着您不需要在生产机器上安装任何 Erlang/Elixir 依赖项。
简而言之,Phoenix 不像Rails,Phoenix 不是应用程序,不是堆栈。它只是一个为您的 Elixir 应用程序提供有用功能的依赖项。
看看Phoenix.PubSub
这是 Phoenix 内部拥有频道通信位的地方。
它目前有两个适配器:
- Phoenix.PubSub.PG2 - 使用分布式 Elixir,直接在服务器之间交换通知。 (这需要您以 elixir/erlang 分布式集群方式部署您的应用程序。)
- Phoenix.PubSub.Redis - 使用 Redis 在服务器之间交换数据。 (这应该类似于在 socket.io 和其他人中找到的解决方案)
我将节点应用程序纯粹用于 socket.io 通道与 Redis PubSub,目前我将它分布在 3 台机器上,其中一台机器上有 nginx 负载平衡支持。
我想用 Phoenix 应用程序替换这个节点应用程序,我对 erlang/Elixir 世界还是个新手,所以我仍然没有弄清楚单个 Phoenix 应用程序如何跨越超过一台机器。谷歌搜索所有可能的缩放和负载平衡术语一无所获。
1.0 release notes 就频道提到了这一点:
Even on a cluster of machines, your messages are broadcasted across the nodes automatically
1) 所以我基本上将我的应用程序部署到 N 个服务器,在每个服务器中启动 Cowboy 服务器,类似于我对 node 和我把它们绑起来 nginx/HAProxy?
2) 如果是这种情况,如何像发行说明中提到的那样在所有节点上广播频道消息?
编辑 3:采取
- 一本免费的内容丰富的书:Stuff Goes Bad: Erlang in Anger
- Erlang 池库 recommendations
编辑 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 应用程序部署到 > 1 台机器,并使用配置为将请求转发到众多应用程序机器之一的 Nginx 负载平衡器。
Erlang 的内置节点通信等用于以不同于 Web 应用程序的方式扩展的应用程序。例如,分布式数据库或队列。
Phoenix 不是应用程序,当您生成 Phoenix 项目时,您创建了一个 Elixir 应用程序,Phoenix 只是一个依赖项(实际上是一堆使构建应用程序的 Web 部分更容易的东西)。
因此,您需要执行的任何节点分发仍然可以在您的 Elixir 应用程序中进行。
您可以只使用 Phoenix 进行网络路由,然后将数据传递到您的底层 Elixir 应用程序以处理跨节点的分发。
值得一读 http://www.phoenixframework.org/v1.0.0/docs/channels(如果您还没有阅读的话),其中解释了 Phoenix 频道如何使用 PubSub 进行分发(可以配置为使用不同的适配器)。
此外,您是否通过 运行 mix phoenix.server 在部署服务器上启动 cowboy?
如果是这样,那么我建议查看 EXRM https://github.com/bitwalker/exrm
这会将您的 Elixir 应用程序捆绑到一个独立的文件中,您可以简单地将其部署到您的生产服务器(如果您愿意,可以使用 Capistrano),然后启动您的应用程序。
这也意味着您不需要在生产机器上安装任何 Erlang/Elixir 依赖项。
简而言之,Phoenix 不像Rails,Phoenix 不是应用程序,不是堆栈。它只是一个为您的 Elixir 应用程序提供有用功能的依赖项。
看看Phoenix.PubSub 这是 Phoenix 内部拥有频道通信位的地方。
它目前有两个适配器:
- Phoenix.PubSub.PG2 - 使用分布式 Elixir,直接在服务器之间交换通知。 (这需要您以 elixir/erlang 分布式集群方式部署您的应用程序。)
- Phoenix.PubSub.Redis - 使用 Redis 在服务器之间交换数据。 (这应该类似于在 socket.io 和其他人中找到的解决方案)