8

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

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

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

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

现在,

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

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

谢谢

4

3 回答 3

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

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

于 2017-04-30T14:43:34.823 回答
3

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

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

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

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

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

于 2017-05-03T01:18:48.630 回答
1

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

于 2017-05-31T10:06:36.700 回答