垂直和水平缩放 Socket.io - "right" 的方法是什么?

Scale Socket.io vertically AND horizontally - what is the "right" way to go?

我想扩展我的 Node.js 套接字应用程序 垂直 水平 ,但我还没有找到一个复杂的解决方案.

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

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

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

另一方面,我看过 this video and read this SO answer 那里说 Redis 不可靠并且 不能保证已发布的消息将到达,因此您应该仅将其用于clustering/vertical 缩放

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

这家伙建议使用 RabbitMQ 来代替 Redis 进行水平缩放。

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

然后是this guy,他实现了自己的方法,通过HTTP请求将消息传递给其他节点,这在某种程度上是有道理的。但是,如果您还可以在服务器之间建立直接套接字连接,同时将消息推送到所有服务器并克服从一台服务器到另一台服务器的延迟,为什么还要进行 HTTP 请求呢?


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

但是每个服务器一个 Redis 和另一个中央 RabbitMQ 似乎有点矫枉过正。

是否有任何已知的 shorter/better 解决方案可以在两个方向上可靠地 Socket.io 缩放?


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

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

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

如果你需要任何片段问我,我会编辑答案,但在 PM2 github 中很少。