繁体   English   中英

AWS应用程序负载均衡器和socket.io

[英]AWS application load balancer and socket.io

我有一个socket.io聊天室运行,当我们在一台机器上运行时,它的流量越来越大。 我们使用ws库为套接字运行基准测试,它们的性能要好得多,这样可以更好地利用我们的硬件。 这需要重写我们的应用程序。

我们的socket.io应用程序允许用户创建使用命名空间实现的私人聊天室。 例如

localhost:8080/room/1
localhost:8080/room/2
localhost:8080/room/3

当一切都在一个实例中时很容易,但现在我们正在寻求将这个容量扩展到多个节点。

我们在亚马逊的云中运行这个实例。 以前看起来像缩放websockets是ELB的一个问题。 我们注意到Amazon现在支持和支持websockets的应用程序负载均衡器。 这听起来不错,但在阅读完文档之后我必须承认我并不知道这意味着什么。 如果我使用带有数千个命名空间的socket.io,我只是将实例放在这个ALB后面,一切都会起作用吗?我的主要问题是:

如果x个用户加入命名空间,ALB会自动将我的消息重定向到适当的用户吗? 所以假设我在ALB后面运行了5个vanilla socket.io实例。 用户1创建名称空间。 几个小时后通过,用户99999来了,并希望加入这个命名空间,是否需要编写任何其他代码来执行此操作,或者alb会重定向所有应该去的地方吗? 发送和接收消息也是如此?

虽然ALB将正确地对用户进行负载平衡,但您需要稍微调整一下代码,因为加入特定房间的用户将分散在不同的服务器中。

在他们的文档中, socket.io提供了一种方法:

现在你有多个Socket.IO节点接受连接,如果你想向每个人(甚至某个房间里的每个人)广播事件,你需要一些在进程或计算机之间传递消息的方法。

负责路由消息的接口就是我们所说的适配器。 您可以在socket.io-adapter之上实现自己的(通过继承它),或者您可以使用我们在Redis上提供的那个:socket.io-redis:

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

ALB设置

我建议在ALB中启用粘性会话 ,否则socket.io握手在使用非websocket传输时会失败,例如长轮询,因为使用此传输的握手任务需要多个请求,并且您需要所有这些请求要对同一台服务器执行。

在此输入图像描述 在此输入图像描述


替代使用没有socket.io适配器的ALB路由。

如果我想避免使用redis数据库。 例如,如果我的房间是由用户创建的,如果userA在实例4上创建了一个房间,如果另一个用户想要加入这个房间,他们将如何知道它所在的实例? 我也需要适配器吗?

此替代方案的目标是将每个房间分配给特定的EC2实例。 我们将使用ALB路由实现此目的

N个房间> 1个实例。

第1步:

您需要将房间网址更改为:

/i1/room/550
/i1/room/20
/i2/room/5
/i5/room/492

存在:

/{instance-number}/room/{room-id}

这是必需的,因此ALB可以将每个房间路由到特定实例。

第2步:

创建N个目标组(N是您此刻拥有的实例数)

图片

第3步:

将每个实例注册到每个目标组

目标组>实例X目标组>目标选项卡>编辑>选择实例X>添加到已注册

Target group X > EC2 Instance X
Target group Y > EC2 Instance Y

在此输入图像描述

第四步:

编辑ALB目标规则

负载均衡器>您的ALB>监听器>查看/编辑规则

在此输入图像描述

第5步:

使用以下设置为每个目标组/实例创建一个规则:

  • IF>路径: /iX/room/*
  • 那么>转发到: instanceX

在此输入图像描述


在此输入图像描述

输入后进行此设置后:

  • /i1/room/550您将使用EC2 Instance 1。
  • /i2/room/200将使用EC2实例2

等等。

现在,您必须制定自己的逻辑,以便在您的实例之间保持平衡。 您不希望有一个实例托管几乎所有组。

我推荐第一种方法,因为它可以轻松自动调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM