Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Websocket 仅为使用通道而定制的Phoenix应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?_Websocket_Socket.io_Publish Subscribe_Elixir_Phoenix Framework - Fatal编程技术网

Websocket 仅为使用通道而定制的Phoenix应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?

Websocket 仅为使用通道而定制的Phoenix应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?,websocket,socket.io,publish-subscribe,elixir,phoenix-framework,Websocket,Socket.io,Publish Subscribe,Elixir,Phoenix Framework,我使用节点应用程序纯粹是为了Redis PubSub的socket.io通道,目前我已将其分布在3台机器上,由其中一台机器上的nginx负载平衡支持 我想用一个Phoenix应用程序替换这个节点应用程序,但我对erlang/Elixir还是很陌生,所以我还没有弄清楚一个Phoenix应用程序如何在多台机器上运行。在谷歌上搜索所有可能的扩展和负载平衡术语,结果一无所获 关于渠道,委员会提到了这一点: 即使在计算机集群上,您的消息也会自动跨节点广播 1) 因此,我基本上是将我的应用程序部署到N台服务

我使用节点应用程序纯粹是为了Redis PubSub的socket.io通道,目前我已将其分布在3台机器上,由其中一台机器上的nginx负载平衡支持

我想用一个Phoenix应用程序替换这个节点应用程序,但我对erlang/Elixir还是很陌生,所以我还没有弄清楚一个Phoenix应用程序如何在多台机器上运行。在谷歌上搜索所有可能的扩展和负载平衡术语,结果一无所获

关于渠道,委员会提到了这一点:

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

1) 因此,我基本上是将我的应用程序部署到N台服务器上,在每台服务器上启动牛仔服务器,类似于我处理node和node的方式,我将它们绑定到nginx/HAProxy

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

编辑3:回答澄清了并没有Phoenix应用程序,而是Elixir/Erlang应用程序,我更新了搜索词,发现了一些关于扩展和负载平衡的有趣结果

  • 一本免费的书:
  • Erlang池库
编辑2:从以下位置找到此项:

Elixir为进程分组和全局进程(在节点之间共享)提供了便利,但您仍然可以使用外部库(如Concur或Zookeeper)进行服务发现,或者依赖HAProxy实现基于HTTP的前端的负载平衡


编辑:是第一个提到inter Elixir通信的,但它与Phoenix本身无关,也不清楚它与负载平衡以及每个Phoenix节点与其他节点通信的关系。

除非我误解了您的用例,您仍然可以使用应用程序的节点版本所使用的精确缩放技术。只需将Phoenix应用程序部署到>1台机器上,并使用配置为将请求转发到众多应用程序机器之一的Nginx负载平衡器


Erlang的内置节点通信等用于以不同于web应用的方式扩展的应用程序。例如,分布式数据库或队列。

Phoenix不是应用程序,当您生成Phoenix项目时,您创建了一个Elixir应用程序,而Phoenix只是一个依赖项(实际上是一系列使构建应用程序的web部件更容易的事情)

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

您可以使用Phoenix进行web路由,然后将数据传递到您的基础Elixir应用程序,以处理跨节点的分发

值得一读(如果您还没有读过的话),它解释了Phoenix频道如何使用PubSub进行分发(可以配置为使用不同的适配器)

另外,您是否正在通过运行mix phoenix.server在部署服务器上启动cowboy

如果是这样的话,我建议您看看EXRM

这将把您的Elixir应用程序捆绑到一个自包含的文件中,您可以简单地将其部署到生产服务器(如果愿意,可以使用Capistrano),然后启动应用程序

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

总之,Phoenix不像Rails,Phoenix不是应用程序,也不是堆栈。它只是一个为Elixir应用程序提供有用功能的依赖项。

请看 这是凤凰内部拥有通道通信位的地方

它目前有两个适配器:

  • PG2-使用分布式长生不老药,在服务器之间直接交换通知。(这要求您以elixir/erlang分布式集群方式部署应用程序。)
  • Phoenix.PubSub.Redis-使用Redis在服务器之间交换数据。(这应该类似于socket.io和其他文件中的解决方案)

在本例中,引用的“您的消息自动跨节点广播”是由内部pubsub完成的?太棒了,我的想法是Phoenix=Rails。更新了我的搜索词,甚至找到了一本关于这个主题的书,我很高兴能帮上忙:)我还推荐了另外两本很棒的书