服务器已发送事件或Websockets的Aws负载均衡器

问题描述 投票:8回答:2

我正在尝试对nodejs服务器发送的事件后端进行负载均衡,我需要知道是否有办法将新连接分发给连接最少的客户端的实例。我遇到的问题是在扩展时,路由继续向已经饱和的实例发送新连接,并且因为连接很长时间,所以这根本不起作用。

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

node.js amazon-web-services websocket server-sent-events aws-load-balancer
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功能并希望手动全部滚动,请查看此guide

您可能还想确保经典的AWS ELB“粘性会话”configuration或更新的ALB "sticky session"选项无法满足您的需求。 ELB通常以最少的“负载”向上游服务器发送连接,并且当与粘性会话组合时可能就足够了。


1
投票

由于您使用的是AWS,我建议您为Node.js应用程序部署使用Elastic Beanstalk。官方文档提供了很好的例子,比如this one。请注意,Beanstalk将为您提供automatically create an Elastic Load Balancer,这正是您所需要的。

默认情况下,当您使用Elastic Beanstalk控制台或EB CLI启用负载平衡时,Elastic Beanstalk会为您的环境创建应用程序负载均衡器。它将负载均衡器配置为侦听端口80上的HTTP流量,并将此流量转发到同一端口上的实例。

[...]

注意:您的环境必须位于具有至少两个可用区中的子网的VPC中,才能创建应用程序负载均衡器。所有新AWS账户都包含符合此要求的默认VPC。如果您的环境位于仅具有一个可用区域中的子网的VPC中,则默认为经典负载均衡器。如果您没有任何子网,则无法启用负载平衡。

请注意,正如您在问题中提到的那样,configuration of a proper health check path是正确平衡请求的关键。

在负载平衡环境中,Elastic Load Balancing每10秒向环境中的每个实例发送一个请求,以确认实例是否正常。默认情况下,负载均衡器配置为在端口80上打开TCP连接。如果实例确认连接,则认为它是健康的。

您可以通过在应用程序中指定现有资源来选择覆盖此设置。如果指定路径(例如/ health),则运行状况检查URL将设置为HTTP:80 / health。运行状况检查URL应设置为始终由应用程序提供的路径。如果将其设置为由应用程序前面的Web服务器提供或缓存的静态页面,则运行状况检查不会显示应用程序服务器或Web容器的问题。

编辑:如果您正在寻找粘性会话,正如我在评论中所述,请按照this guide中提供的步骤操作:

使用控制台启用粘性会话

  1. https://console.aws.amazon.com/ec2/打开Amazon EC2控制台。
  2. 在导航窗格的LOAD BALANCING下,选择Target Groups。
  3. 选择目标组。
  4. 在Description选项卡上,选择Edit attributes。
  5. 在“编辑属性”页面上,执行以下操作:

一个。选择启用负载均衡器生成的cookie粘性。

湾对于粘滞持续时间,请指定1秒到7天之间的值。

C。选择保存。

© www.soinside.com 2019 - 2024. All rights reserved.