服务器发送事件或Websocket的AWS负载均衡器

时间:2019-01-29 19:01:15

标签: node.js amazon-web-services websocket server-sent-events aws-load-balancer

我正在尝试负载均衡一个nodejs服务器发送的事件后端,我需要知道是否有一种方法可以将新连接分配给连接最少的客户端实例。我遇到的问题是,按比例放大时,路由会继续向已饱和的实例发送新的连接,并且由于连接的寿命很长,因此根本无法正常工作。

对于长期连接的水平扩展,我有什么选择?

2 个答案:

答案 0 :(得分:1)

由于您使用的是AWS,因此建议您在Node.js应用程序部署中使用Elastic Beanstalk。官方文档提供了很好的示例,例如this one。请注意,Beanstalk会automatically create an Elastic Load Balancer为您服务,这正是您想要的。

  

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

     

[...]

     

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

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

  

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

     

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

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

  

要使用控制台启用粘性会话

     
      
  1. 通过https://console.aws.amazon.com/ec2/打开Amazon EC2控制台。

  2.   
  3. 在导航窗格上的LOAD BALANCING下,选择目标组。

  4.   
  5. 选择目标组。

  6.   
  7. 在“描述”选项卡上,选择“编辑属性”。

  8.   
  9. 在“编辑属性”页面上,执行以下操作:

  10.   
     

a。选择启用负载平衡器生成的cookie粘性。

     

b。对于“粘性持续时间”,请在1秒到7天之间指定一个值。

     

c。选择保存。

答案 1 :(得分:1)

您似乎想要一个可以同时提供“粘性会话”和使用“最少连接”而不是“循环”策略的负载均衡器。不幸的是,NGINX无法提供此功能。

HAProxy(高可用性代理)允许这样做:

on: [id: i.user_id, other_field: i.other_field]

如果您需要ELB功能并想要手动滚动所有功能,请查看此guide

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