首页 文章

使用粘性会话和websockets进行扩展

提问于
浏览
3

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

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

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

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

1 回答

  • 2

    解决方案是Application Load Balancer(见comment) .

    • 起初我们不得不禁用轮询,因为这对其余部分不起作用 . 这是通过手动定义传输来完成的 .
    let ioSocket = io('', {
        path: '/socket.io-client'
        transports: ['websocket']
    
    • 之后,我们设置了一个带有两个目标组的标准应用程序负载均衡器:一个用于websockets,另一个用于所有其他请求 . websocket目标组的规则通过正则表达式匹配特定路径:

    Path pattern

    • 上一个问题是扩展:如果其中一个实例因集群连接负载较低而关闭,则可能会丢失 . 在客户端断开连接后,通过简单的重新连接修复了这个问题(在我们的例子中是一个角度应用程序):
    [...]
    this.socket.on('disconnect', () => {
        // Reconnect after connection loss
        this.connect();
    });
    [...]
    

相关问题