带有多个服务器的Socket.io,没有粘性会话

时间:2020-04-23 23:57:47

标签: node.js socket.io socket.io-redis

我们的客户有一个非常具体的体系结构,它限制了连接的可能性。这是一个带有React和NodeJS的聊天机器人,将Socket.IO用于我们的websocket。在套接字服务器之上,有一个强制性的HAProxy配置为使用循环负载平衡,因此客户端每次都将连接到其他套接字服务器。该应用程序可以在单个Socket实例上正常运行,但是当添加第二个Socket实例时,我们注意到套接字事件是随机到达每个实例的,并且响应事件只返回给客户端的情况很小。

除前端客户端外,还有一些工作客户端处理来自队列的请求。这些也表现不正常,即使没有事件要发送(这可能是一个单独的问题),也要与每个套接字服务器连接和断开连接。

我们正在像这样使用redis-adapter

this.io.adapter(this.redis({ host: this.redis_host, port: this.redis_port, password: this.redis_password }));

我正在使用传输器:['websocket','polling'],但是我们尝试了所有这些组合。

我们也使用这样的房间:

  1. 前端客户端连接并具有唯一的ID
  2. 后端将客户端添加到以ID为名称的房间
  3. 后端将请求添加到队列中以由工作人员客户端处理
  4. Worker客户端使用请求并对其主体中具有ID的任何后端发出响应
  5. 后端使用ID向该ID的房间发出响应

前端客户端在初始化时被添加到会议室:

initialize() {
    this.io.on(this.SocketConstants.CONNECTION, (client) => {
        const UniqueId = this.getId(client)
        client.join(UniqueId);
      }

工人的回应被发送到房间:

client.on(this.SocketConstants.SEND_TO, async (data) => {
      this.io.to(data.UniqueId).emit(this.SocketConstants.RESPONSE, data);
    });

这是否有可能实现?如何确保Redis在服务器之间正确共享socketId和房间?

0 个答案:

没有答案