通过粘性会话和WebSocket进行扩展

Tob*_*ngl 6 load-balancing amazon-web-services node.js sticky-session elastic-load-balancer

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

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

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

有没有一种方法可以在实例之间转移用户会话或使Websocket在没有粘性会话的情况下工作(也许使用Redis)?

Tob*_*ngl 8

解决方案是应用程序负载均衡器(请参阅评论)。

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

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

路径模式

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

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