使用粘性会话和 websockets 进行扩展
Scaling with sticky sessions and websockets
最初我们有两个 AWS EC2 实例,node.js 运行 位于具有粘性会话的负载均衡器后面。随着负载的增加,会添加更多实例。
但是我们在使用这种方法时遇到了问题。由于我们的应用程序主要用于研讨会,因此负载通常会在短时间内(研讨会开始)增加,并且每个研讨会参与者对前两个实例都有粘性会话,新实例几乎 none。因此,性能一直很差。
第一个想法是:让我们禁用粘性会话。但这会破坏我们的 websockets,因为它们需要粘性会话(至少这是我读过的)。另一个问题是负载减少。实例关闭,套接字连接也丢失。
是否有一种方法可以在实例之间转移用户会话或让 websockets 在没有粘性会话的情况下工作(可能使用 Redis)?
解决方案是 Application Load Balancer (see )。
起初我们不得不禁用轮询,因为这对其余部分不起作用。这是通过手动定义传输来完成的。
let ioSocket = io('', {
path: '/socket.io-client'
transports: ['websocket']
之后,我们设置了一个具有两个目标组的标准应用程序负载均衡器:一个用于 websockets,一个用于所有其他请求。 websocket 目标组的规则通过正则表达式匹配特定路径:
最后一个问题是缩放:如果其中一个实例因为集群负载较低而关闭,连接可能会丢失。这是在客户端断开连接后通过简单的重新连接修复的(在我们的例子中是 angular 应用程序):
[...]
this.socket.on('disconnect', () => {
// Reconnect after connection loss
this.connect();
});
[...]
最初我们有两个 AWS EC2 实例,node.js 运行 位于具有粘性会话的负载均衡器后面。随着负载的增加,会添加更多实例。
但是我们在使用这种方法时遇到了问题。由于我们的应用程序主要用于研讨会,因此负载通常会在短时间内(研讨会开始)增加,并且每个研讨会参与者对前两个实例都有粘性会话,新实例几乎 none。因此,性能一直很差。
第一个想法是:让我们禁用粘性会话。但这会破坏我们的 websockets,因为它们需要粘性会话(至少这是我读过的)。另一个问题是负载减少。实例关闭,套接字连接也丢失。
是否有一种方法可以在实例之间转移用户会话或让 websockets 在没有粘性会话的情况下工作(可能使用 Redis)?
解决方案是 Application Load Balancer (see
起初我们不得不禁用轮询,因为这对其余部分不起作用。这是通过手动定义传输来完成的。
let ioSocket = io('', { path: '/socket.io-client' transports: ['websocket']
之后,我们设置了一个具有两个目标组的标准应用程序负载均衡器:一个用于 websockets,一个用于所有其他请求。 websocket 目标组的规则通过正则表达式匹配特定路径:
最后一个问题是缩放:如果其中一个实例因为集群负载较低而关闭,连接可能会丢失。这是在客户端断开连接后通过简单的重新连接修复的(在我们的例子中是 angular 应用程序):
[...] this.socket.on('disconnect', () => { // Reconnect after connection loss this.connect(); }); [...]