【发布时间】: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”但在不同的端口上运行它。然后我们心爱的nginx 的upstream 组和ip_hash 会给我们种相同的效果。
此外,我想让我的应用程序具有弹性。不仅在集群级别,而且在纵向扩展和横向扩展。鉴于我的应用程序在 redis 中包含 socket.io 实现和会话令牌管理,最佳实践是什么?
我是错过了什么还是我完全错了?哪种方式是最好的扩展方式?
【问题讨论】:
-
您找到解决问题的方法了吗?
-
是的,我做了并且似乎适用于我的用例。但我要进行一些测试。我将在接下来的 2 周内获得更好的结果。会及时通知您。
-
那太棒了!
-
我也在努力解决这个问题。到目前为止我得到的最好的是
pm2 scale并根据NODE_APP_INSTANCE增加端口号;当然是使用 Redis;列出 nginx 上游的所有主机和端口;效果很好。 -
它有效,但在“规模”上会变得丑陋。
标签: node.js nginx redis socket.io pm2