负载均衡 websockets - AWS 弹性负载均衡器

Loadbalancing web sockets - AWS Elastic Loadbalancer

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

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

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

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

现在,

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

2) websocket 连接是否有任何限制,如 64K 以及如何克服多个服务器,因为用户是通过负载平衡器访问的。

谢谢

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

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

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

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

此解决方案的优点是您消除了对单个 EC2 实例的依赖,您的应用程序将更好地扩展和处理故障。

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

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

最近不得不将 crossbar.io websockets 与 ALB 连接起来。基本上有两件事要考虑。 1)您需要在目标组属性上将粘性设置为 1 天。 2)如果连接未升级,您要么需要在与 returns 静态网页相同的端口上使用某些东西,要么需要一个单独的端口为静态网页提供服务,并通过自定义健康检查指定目标组上的该端口。在 ELB 上使用 ALB,ALB 支持 ws:// 和 wss://,他们只缺少对 websockets 的健康检查。