AWS负载均衡器用于服务器发送事件或Websockets

12

我正在尝试负载均衡一个nodejs服务端发送事件后台,并且需要知道是否有一种方法来将新连接分配给已连接客户端最少的实例。我的问题是在扩展时,路由器继续将新连接发送到已经饱和的实例上,而且由于这些连接具有长寿命,所以这种方法行不通。

对于水平扩展长期连接,我有哪些选项可用?

2个回答

1

看起来您希望有一个负载均衡器,既能提供“粘性会话”,又能使用“最少连接”而不是“轮询”策略。不幸的是,NGINX 无法提供此功能。

HAProxy(高可用性代理)可以实现这一点:

backend bk_myapp
 cookie MyAPP insert indirect nocache
 balance leastconn
 server srv1 10.0.0.1:80 check cookie srv1
 server srv2 10.0.0.2:80 check cookie srv2

如果您需要ELB功能并希望手动完成所有操作,请查看此指南
您可能还想确保经典AWS ELB的“粘性会话”配置或较新的ALB“粘性会话”选项是否满足您的需求。 ELB通常将连接发送到负载最少的上游服务器,并且与粘性会话结合使用时可能已经足够了。

好的,我会看一下。粘性会话运行良好,我使用Redis在节点之间共享状态。配置文章是关于经典负载均衡器的,我认为它将被从AWS中删除。 - ajaxon
这适用于经典负载均衡器,但是客户端的关闭事件现在无法传递到后端。 - ajaxon

0

既然您正在使用AWS,我建议您使用Elastic Beanstalk来部署Node.js应用程序。官方文档提供了很好的示例,比如这个。请注意,Beanstalk会自动为您创建弹性负载均衡器,这正是您所需要的。

默认情况下,当您在Elastic Beanstalk控制台或EB CLI中启用负载均衡时,Elastic Beanstalk会为您的环境创建一个应用程序负载均衡器。它会将负载均衡器配置为在端口80上侦听HTTP流量,并将此流量转发到相同端口上的实例。
注意:要创建应用程序负载均衡器,您的环境必须位于具有至少两个可用区子网的VPC中。所有新的AWS帐户都包括符合此要求的默认VPC。如果您的环境位于仅有一个可用区子网的VPC中,则默认使用经典负载均衡器。如果您没有任何子网,则无法启用负载均衡。
请注意,在正确平衡请求方面,适当的健康检查路径配置是关键,正如您在问题中提到的那样。
在负载均衡环境中,弹性负载平衡每10秒向环境中的每个实例发送请求以确认实例是否健康。默认情况下,负载均衡器配置为在端口80上打开TCP连接。如果实例确认连接,则认为它是健康的。
您可以选择通过指定应用程序中的现有资源来覆盖此设置。如果您指定了一个路径,例如/health,则健康检查URL将设置为HTTP:80/health。健康检查URL应设置为始终由您的应用程序提供服务的路径。如果它设置为由应用程序前面的Web服务器提供或缓存的静态页面,则健康检查将无法显示应用程序服务器或Web容器的问题。
编辑:如果您正在寻找像我在评论中描述的粘性会话,请按照this guide中提供的步骤进行操作。
使用控制台启用粘性会话
1. 打开 Amazon EC2 控制台 https://console.aws.amazon.com/ec2/。 2. 在导航窗格中,选择“负载均衡”,然后选择“目标组”。 3. 选择目标组。 4. 在“描述”选项卡上,选择“编辑属性”。 5. 在“编辑属性”页面上,执行以下操作: a. 选择“启用负载均衡器生成的 cookie 粘性”。 b. 对于“粘性持续时间”,指定一个介于 1 秒和 7 天之间的值。 c. 选择“保存”。

我正在使用Beanstalk。我的问题是如何配置路由到实例,以便它们不会过载单个实例。连接持续存在并可能持续数小时。目前正在使用轮询来分发新请求,但这种方法行不通。 - ajaxon
你是否正在寻找“粘性会话”机制?理想情况下,为了获得更好的可扩展性,你应该选择无状态。 - Fabio Manzano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接