问题 聊天项目 - 使用socket.io进行负载均衡


我参与了聊天的开发项目,我们正在使用node.js,socket.io(rooms)和mongodb。我们正处于性能测试阶段,如果系统需要负载平衡,我们非常担心。

如果我们的项目需要,我们如何发展? J'a研究NGINX看起来很酷,但我们怀疑是否能解决我们的问题,因为系统将如何进行聊天,我们担心服务器不能正确地相互交谈......

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


7904
2018-02-08 04:03


起源



答案:


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

其中......


9
2018-02-13 06:35



我如何使用AWS ELB? - Renan Basso
我需要做什么来配置redis服务器? - Renan Basso
要使用AWS ELB,您需要一个托管服务器的AWS账户。您可以通过ELB将端口转发到不同的服务器。它太酷了。就Redis配置而言,这很容易设置。这几乎是即插即用。将它放在与其他服务器防火墙的中央服务器上。 - Brian Noah
嗨@BrianNoah我对这个答案有疑问。我已经实现了确切的代码,你已经在上面了。这是在负载均衡器后面运行socket.io所需要的吗?如果是这样,最好的方法是实际测试它是否正常工作? - Dev123Dev
@Srmuhs我实现了相同的架构。它在我广播的时候有效,但是当我在特定的套接字ID上发出它时就会失败,就像在一对一的聊天中一样,特别是当它从负载均衡器后面的其他服务器生成时。 - Asif Saeed


答案:


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

其中......


9
2018-02-13 06:35



我如何使用AWS ELB? - Renan Basso
我需要做什么来配置redis服务器? - Renan Basso
要使用AWS ELB,您需要一个托管服务器的AWS账户。您可以通过ELB将端口转发到不同的服务器。它太酷了。就Redis配置而言,这很容易设置。这几乎是即插即用。将它放在与其他服务器防火墙的中央服务器上。 - Brian Noah
嗨@BrianNoah我对这个答案有疑问。我已经实现了确切的代码,你已经在上面了。这是在负载均衡器后面运行socket.io所需要的吗?如果是这样,最好的方法是实际测试它是否正常工作? - Dev123Dev
@Srmuhs我实现了相同的架构。它在我广播的时候有效,但是当我在特定的套接字ID上发出它时就会失败,就像在一对一的聊天中一样,特别是当它从负载均衡器后面的其他服务器生成时。 - Asif Saeed


查看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事件。


3
2018-02-11 14:30