垂直和水平缩放Socket.io - 什么是"正确"的方式?

Mar*_*ies 20 scalability rabbitmq redis node.js socket.io

我想纵向横向扩展我的Node.js Socket应用程序,但我还没有找到一个复杂的解决方案.

我的应用程序有两个用例:

  1. 从一个用户向所有其他用户广播消息
  2. 将消息从一个用户推送到用户子集

一方面,我读到我需要Redis 和socket.io-redis 这两种情况

另一方面,我观看了这个视频并阅读了这个SO答案,其中说Redis不可靠并且不能保证发布的消息会到达,所以你应该只用它来进行聚类/垂直缩放

使用ServiceBus的 Microsoft Azures解决方案是不可能的,因为我不想使用Azure.

该家伙建议使用RabbitMQ进行水平缩放,而不是Redis .

对于垂直扩展,还有socket.io-clusterhub,一个用于节点进程的IPC,但它似乎只适用于Socket.io <= v0.9.0

然后就是这个人,他已经实现了自己的方法,通过HTTP请求将消息传递给其他节点,这在某种程度上是有道理的.但是为什么HTTP请求你是否也可以在服务器之间建立直接套接字连接,同时将消息推送到所有服务器并克服从一个服务器到另一个服务器的延迟?


作为结论,我想也许我可以在EACH服务器上使用Redis,只是为了在多个进程上集群我的应用程序时交换消息,以及RabbitMQ作为S2S通信解决方案.

但是,每个服务器和另一个中央RabbitMQ有一个Redis似乎有点过分.

是否有任何已知的更短/更好的解决方案可以在两个方向上可靠地扩展Socket.io?


编辑:我曾尝试将单个Redis服务器用于多个Node.js服务器,其中每个服务器都通过粘性会话在所有核心上使用群集.虽然Clustering本身就像一个带有redis的魅力,但在使用多个服务器时似乎存在问题.消息不会到达其他节点.

dag*_*nza 2

我想说 Kafka 非常适合水平扩展。这是一种在服务器之间分发大量事件的相当复杂的方式(这最终就是您想要的)。这是一篇很好的读物:https ://engineering.linkedin.com/kafka/running-kafka-scale

关于垂直比例,我会使用称为 PM2 ( https://github.com/Unitech/pm2 ) 的东西,而不是 socket.io-clusterhub,它允许您动态调整每台计算机中应用程序的比例并控制记录并向 keymetrics.io 报告(如果您正在使用它)。

如果您需要任何片段,请询问我,我将编辑答案,但在 PM2 github 中,片段很少。