如何使 socket.io 在 pm2 集群模式下正常工作?

Posted

技术标签:

【中文标题】如何使 socket.io 在 pm2 集群模式下正常工作?【英文标题】:How to make socket.io work properly with pm2 cluster mode? 【发布时间】:2019-10-02 16:55:54 【问题描述】:

我一直在寻找各种解决方案,但是当我把它们放在一起时,看起来很混乱。

我正在尝试为具有 socket.io 实现的应用程序实现 pm2 集群模式。现在,我理解了需要无状态才能使我的应用程序在集群模式下正常工作的概念。 socket.io 不是无状态的。令人困惑的是,

1) 我们的朋友 Cam says 当我们在最大数量的 CPU 上生成时,仅实现 socket.io-redis 就可以正常工作。 2)当我引用socket.io says时,

注意:使用 Redis 适配器时仍然需要 sticky-session。”

对于 1),根据我的研究,互联网应该不同意它会起作用。也许 Cam 先生很幸运拥有 websocket 的传输方式,并且可能不必处理 polling。但同时我认为它应该可以工作,因为redis-adapter 是我们用来使其无状态的。

INFO:它使用websocket 作为传输方法对我有用,但我无法使用polling 对其进行测试。

对于 2),我认为我们可以结合 Joni 先生的 advice 在“集群”中使用“pm2”但在不同的端口上运行它。然后我们心爱的nginxupstream 组和ip_hash 会给我们相同的效果。

此外,我想让我的应用程序具有弹性。不仅在集群级别,而且在纵向扩展和横向扩展。鉴于我的应用程序在 redis 中包含 socket.io 实现和会话令牌管理,最佳实践是什么?

我是错过了什么还是我完全错了?哪种方式是最好的扩展方式?

【问题讨论】:

您找到解决问题的方法了吗? 是的,我做了并且似乎适用于我的用例。但我要进行一些测试。我将在接下来的 2 周内获得更好的结果。会及时通知您。 那太棒了! 我也在努力解决这个问题。到目前为止我得到的最好的是pm2 scale 并根据NODE_APP_INSTANCE 增加端口号;当然是使用 Redis;列出 nginx 上游的所有主机和端口;效果很好。 它有效,但在“规模”上会变得丑陋。 【参考方案1】:

我有solution!!!它对我来说非常好用!感谢@elad 和贡献者。我已经进行了大量的测试(超过 2 个月!),从来没有遇到过问题。我不会通过解释 sn-p 的作用来不尊重作者,因为它已经被逐行描述得足够多。 我花了足够长的时间,因为回购中有未解决的问题并且必须确定。现在我确信这些问题在理解不同组件的情况下是可行的。毕竟,这不是魔法!

如果您仍有疑问/问题,请查看并告诉我。

【讨论】:

以上是关于如何使 socket.io 在 pm2 集群模式下正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在插槽IO中使用PM2集群?

nodejs - 对于在集群模式下运行的应用程序,我应该如何使用 nginx 和 pm2?

PM2 集群模式与节点集群性能

PM2 以集群模式停止

在nodeJs中将pm2与socket io集成[关闭]

nodejs pm2集群模式配置