聊天项目 - 使用 socket.io 进行负载平衡

Chat project - load balance with socket.io

我参与了一个聊天开发项目,我们使用 node.js、socket.io(房间)和 mongodb。我们正处于性能测试阶段,非常关心系统是否需要负载均衡。

如果我们的项目需要,我们如何开发? J'a 在 NGINX 上的研究看起来很酷,但我们怀疑是否解决了我们的问题,因为系统将如何聊天,我们担心服务器之间没有正确地~交谈~......

如果我们需要负载均衡,我们去哪里?

查看 NPM 包 mong.socket.io。它能够将 socket.io 数据保存到 mongoDB,如下所示;

{
    "_id" : ObjectId("54b901332e2f73f5594c6267"),
    "event" : "join",
    "message" : {
            "name" : "join",
            "nodeId" : 426506139219,
            "args" : "[\"URAiA6mO6VbCwquWKH0U\",\"/54b6821asdf66asdasd2f0f9cd2997413780273376\"]"
    }}

或者您可以使用此处提到的 redis 适配器;

Socket.IO Using multiple nodes

然后只需使用 NGINX 反向代理,所有节点进程应该相互共享 Socket.IO 事件。

为了确保我们可以扩展到多个节点,同时保持不同客户端和不同服务器之间的互连,我使用了 redis。它的使用和设置实际上非常简单。

这样做是在您的服务器之间创建一个 pub/sub 系统来跟踪您不同的套接字客户端。

var io = require('socket.io')(3000),
    redis = require('redis'),
    redisAdapter = require('socket.io-redis'),
    port = 6379,
    host = '127.0.0.1',
    pub = redis.createClient(port, host),
    sub = redis.createClient(port, host, {detect_buffers: true}),
    server = http(),
    socketServer = io(server, {adapter: redisAdapter({pubClient: pub, subClient: sub})});

在此处阅读更多内容:socket.io-redis

就处理不同的节点服务器而言,有不同的方法。

  • AWS ELB(弹性负载均衡器)
  • Nginx
  • 阿帕奇
  • HAProxy

其中...