负载均衡Web套接字 - AWS Elastic Loadbalancer

时间:2017-04-24 20:04:17

标签: amazon-ec2 spring-websocket elastic-load-balancer

我有一个关于如何使用AWS弹性负载均衡器对Web套接字进行负载均衡的问题。

我在AWS弹性负载均衡器后面有2个EC2实例。

当任何用户登录时,将与服务器之一建立用户会话,例如EC2 instance1。现在,来自同一用户的所有请求都将路由到EC2 instance1。

现在,我有一个来自不同系统的不同无状态请求。该请求将包含userId。此请求最终可能会转到EC2 instance2。我们应该根据请求中的userId向用户发送通知。

现在,

1)假设用户会话是EC2 instance1,但通知源自EC2 instance2。  在这种情况下,我不确定如何通知用户浏览器。

2)对于像64K这样的websocket连接是否存在任何限制以及如何克服多个服务器,因为用户正在通过负载均衡器。

由于

3 个答案:

答案 0 :(得分:5)

  1. 您需要其他东西来通知浏览器的websocket服务器端有关来自其他系统的事件。有一些基于发布 - 订阅的解决方案可能有所帮助,但不知道更多细节,有点难以找出最适合的解决方案。 Redis通常是一个很好的答案,Elasticache支持它。

  2. 我发现这与AWS ELB的限制有关: http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_elastic_load_balancer 但似乎没有一个与你的问题有关。

答案 1 :(得分:3)

Websocket请求在切换到websockets之前以HTTP通信开始。理论上,如果您可以在初始HTTP请求中包含cookie,那么ELB的粘性会话功能将允许您将websockets定向到特定的EC2实例。但是,您的websocket客户端可能不支持此功能。

首选解决方案是让您的EC2实例无状态。将websocket会话数据存储在AWS Elasticache(Redis或Memcached)中,然后无论使用哪个EC2实例,传入连接都能够访问会话。

此解决方案的优点是您可以删除对各个EC2实例的依赖性,您的应用程序将扩展并更好地处理故障。

如果ELB有太多的传入连接,那么它应该自动扩展。虽然我无法找到参考。 ELB的规模相对较慢 - 分钟而不是秒,如果您预计流量激增,那么AWS可以预热"预热"更多ELB资源。这是通过支持请求完成的。

此外,ELB连接超时的因素。默认情况下,这是60秒,可以通过AWS控制台或API增加。您的应用程序需要在超时之前发送至少1个字节的流量,否则ELB将断开连接。

答案 2 :(得分:0)

最近不得不用ALB连接crossbar.io websockets。基本上有两件事需要考虑。 1)您需要在目标组属性上将粘性设置为1天。 2)如果连接未升级,则需要在返回静态网页的同一端口上使用某些内容,或者为具有指定目标组上的端口的自定义运行状况检查的静态网页提供单独的端口。在ELB上寻找ALB,ALB支持ws://和wss://,他们只缺乏对websockets的健康检查。