在Heroku上扩展Phoenix平台

6

我没有太多heroku的经验,对phoenix更是了解不多,所以这可能是一个愚蠢的问题...但我想确保我在选择托管方面做出了正确的选择 :)

据我所知,你要扩展phoenix的方式是添加另一个服务器,启动另一个节点,然后连接它们,让BEAM / OTP发挥其魔力来处理工作负载平衡。在heroku上,dynos无法通过本地网络进行交流,这是BEAM需要进行集群的,如果添加dynos将导致更传统的缩放模型,在其中外部负载均衡器在未连接的节点之间平衡连接,数据库则成为共享状态。

我的问题是这会有多大的影响? 这只是在您达到严重的负载/规模水平时才存在的问题,还是意味着要在基础设施上花费比必要更多的资金?

2个回答

7
在支持集群的主机上可以获得最佳性能,但是Phoenix有一个PubSub适配器系统,专门用于像Heroku这样的部署:https://github.com/phoenixframework/phoenix_pubsub
只需一行配置更改和mix.exs依赖项条目,您就可以通过我们的Redis适配器在Heroku上拥有多节点通道。

1
在Phoenix 1.2中,默认情况下为PubSub设置了PG2适配器;在Heroku上,是否有使用Redis而不是当前默认值的原因?谢谢! - Svilen

2

这是一个非常开放性的问题,所以我相信我的答案不会很全面。

在你的情况下,最重要的问题是:我是否使用Phoenix channels?

如果您使用普通的HTTP,它可以大多数情况下是无状态的。有许多方法来模拟有状态的连接,例如将会话存储在cookie中。归根结底,如果您的后端服务器彼此连接,则并不重要,因为每个服务器都在进行独立计算。您的负载均衡器可以随机选择任何服务器,并且它总是有效的。HTTP的这种酷功能使得该协议能够很好地扩展。您肯定可以在这种情况下使用Heroku,它将运行得非常好。

如果您使用Phoenix channels,则情况会变得复杂。您仍然希望能够连接到任何服务器,但您可能会实时向其他用户发送消息,而他们可能连接到其他服务器。Phoenix通过使用BEAM进行聚集来解决了这个问题,这对于Heroku来说将是困难的,甚至是不可能的。

总之:这不是小规模/大规模的问题。这是一个特性的问题。扩展频道将需要聚集,扩展普通的HTTP则不需要。


为每个dyno实例化Phoenix应用程序并不是一个很大的成本(基本上就是发生了什么)?即使只是普通的HTTP请求? - Nando Sousa
这不是一个很大的成本。如果你比较类似的Phoenix和Rails应用程序,Phoenix应该具有更低的内存和CPU占用。因此,如果您在一个dyno上资源不足,只需再启动另一个dyno即可。 - tkowal
我认为这也是可以通过 https://github.com/phoenixframework/phoenix_pubsub_redis 来缓解的问题。感谢您对一个不太好的问题给出了很好的答案 :) - Matt Briggs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接