垂直和水平地缩放Socket.io – 什么是“正确的”方式?

我想纵向横向扩展我的Node.js套接字应用程序,我还没有find一个复杂的解决scheme。

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

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

一方面,我已经读过,我需要Redis和socket.io-redis

另一方面,我观看了这个video ,看到这个回答说Redis不可靠,并且不能保证发布的消息到达 ,所以你只能用它来进行聚类/垂直缩放

使用ServiceBus的 Microsoft Azure解决scheme是没有问题的,因为我不想使用Azure。

这个人不是Redis,而是推荐使用RabbitMQ进行水平缩放。

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

然后有这个人 ,他已经实现了自己的方法通过HTTP请求传递消息到其他节点,这是有道理的。 但为什么HTTP请求,如果你也可以build立服务器之间的直接套接字连接,同时推送消息到所有的服务器,克服从一个服务器到另一个延迟?


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

但是有一个Redis per Server和另外一个RabbitMQ似乎有些过火了。

是否有任何已知的更短/更好的解决scheme来双向可靠地扩展Socket.io?


编辑:我已经尝试使用单个Redis服务器多个Node.js服务器,其中每个服务器通过所有核心上的粘滞会话使用群集。 虽然群集在自己的作品像redis的魅力,使用多个服务器似乎有问题。 消息不会到达其他节点

我会说卡夫卡非常适合水平缩放。 在服务器之间分配大量事件是相当复杂的(最终是你想要的)。 这是一个很好的阅读: https : //engineering.linkedin.com/kafka/running-kafka-scale

关于垂直的规模,而不是socket.io-clusterhub我会使用一些称为PM2( https://github.com/Unitech/pm2 ),它允许您dynamic调整应用程序在每台计算机的规模,以及控制logging并报告给keymetrics.io(如果使用的话)。

如果你需要任何代码片段问我,我会编辑答案,但在PM2 Github中有很less。