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

时间:2016-05-09 13:06:28

标签: node.js redis socket.io rabbitmq scalability

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

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

  1. 从一个用户向所有其他用户广播消息
  2. 将消息从一个用户推送到用户子集
  3. 一方面,我已经读到我需要Redis用于两个案例以及socket.io-redis

    另一方面,我看过this video并阅读此SO answer,其中 Redis 不可靠且无法保证发布的消息将到达,因此您应仅将其用于群集/垂直缩放

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

    该人建议使用 RabbitMQ 进行水平缩放,而非Redis。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我说Kafka非常适合横向缩放。这是一种在服务器之间分发大量事件的相当复杂的方式(最终是你想要的)。这是一个很好的解读:https://engineering.linkedin.com/kafka/running-kafka-scale

关于垂直比例,我将使用名为PM2(https://github.com/Unitech/pm2)的东西代替socket.io-clusterhub,它允许您动态调整每台计算机中应用程序的规模,以及控制日志和报告到keymetrics.io(如果你正在使用它)。

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