扩展粘性会话和websockets

时间:2018-01-22 13:43:33

标签: node.js amazon-web-services load-balancing elastic-load-balancer sticky-session

最初,我们有两个AWS EC2实例,其中node.js在带有粘性会话的负载均衡器后面运行。随着负载的增加,会添加更多实例。

但我们正面临着这种方法的问题。由于应用程序主要用于研讨会,负载通常会在很短的时间内(研讨会开始)增加,并且每个研讨会参与者都与前两个实例进行粘性会话,而新的实例几乎没有。因此,性能仍然很差。

首先想到的是:让我们禁用粘性会话。但这会破坏我们的websockets,因为它们需要粘性会话(至少这是我所读过的)。另一个问题是负载减少。实例关闭,套接字连接也会丢失。

是否有方法在实例之间转换用户会话或让websockets在没有粘性会话的情况下工作(可能使用Redis)?

1 个答案:

答案 0 :(得分:3)

解决方案是Application Load Balancer(请参阅comment)。

  1. 首先我们必须禁用轮询,因为这对其余部分不起作用。这是通过手动定义传输来完成的。

    let ioSocket = io('', {
        path: '/socket.io-client'
        transports: ['websocket']
    
  2. 之后我们设置了一个标准的应用程序负载均衡器,它有两个目标组:一个用于websockets,另一个用于所有其他请求。 websocket目标组的规则通过正则表达式匹配特定路径:

  3. Path pattern

    1. 最后一个问题是扩展:如果其中一个实例因集群连接负载较低而关闭,则可能会丢失。在客户端断开连接后(在我们的例子中是一个角度应用程序),通过简单的重新连接修复了这个问题:

      [...]
      this.socket.on('disconnect', () => {
          // Reconnect after connection loss
          this.connect();
      });
      [...]