聊天项目 – 与socket.io负载平衡

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

如果我们的项目需要,我们该如何发展? J'a对NGINX的研究看起来很酷,但是我们怀疑是否解决了我们的问题,因为系统会如何聊天,我们担心服务器不能正确对话。

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

为了确保我们可以扩展到多个节点,但是保持不同客户端和不同服务器之间的互连,我使用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的

除其他…

检查NPM包mong.socket.io 。 它可以像下面一样将socket.io数据保存到mongoDB中;

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

或者你可以使用上面提到的redis适配器;

Socket.IO使用多个节点

那么就使用NGINX反向代理,所有的节点进程应该共享Socket.IO事件。