【问题标题】:Loadbalancing web sockets - AWS Elastic Loadbalancer负载平衡 websockets - AWS 弹性负载平衡器
【发布时间】:2017-09-21 15:34:27
【问题描述】:

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

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

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

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

现在,

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 即使我使用 Elasticcache 缓存会话,websocket 还能工作吗?我以为,websocket 是用单台服务器建立的。
      • 是的,一旦建立连接,它将在该连接期间继续转到同一个 EC2 实例。在您的问题中,您指的是 来自不同系统的不同无状态请求 这可能会被路由到不同的 EC2 实例,因为它是一个新连接。如果多个连接需要共享会话数据,那么 Elasticcache 是在多个 EC2 实例之间共享会话数据的一种方式。
      • 您好,即使是多个连接共享会话数据,如果无状态请求到实例 1 并且与实例 2 建立 websocket 怎么办。这里,会话数据将在实例中可用1 & 2. 但是,它如何从实例 1 向实例 2 发送 websocket 通知。
      • 这更棘手。对于小型项目,让连接到浏览器的服务器进程轮询 Elasticache 以获取更改并中继它们。对于更大规模而言,跟踪实时连接以及 AWS SNS 等排队服务并将通知定向到正确目的地的消息传递过程将更具可扩展性。
      • 对不起。我还是不清楚这里。即使使用 AWS SNS,如何从其他实例发出通知?我可以从实例 1 和 2 公开 Web 服务并调用该服务,但这很耗时。寻找更好的解决方案。
      【解决方案3】:
      1. 您将需要其他东西来通知浏览器的 websocket 的服务器端有关来自其他系统的事件。有几个基于发布-订阅的解决方案可能会有所帮助,但在不了解更多细节的情况下,很难确定哪种解决方案最适合。 Redis 通常是一个很好的答案,Elasticache 支持它。

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

      【讨论】:

      • 我只是想了解 Redis 如何解决这个问题,因为事件发起和 websocket 会话位于两个不同的实例上。
      • 说实话我对 Redis 的模型不是很熟悉,但它似乎是最广泛使用/最简单的方法之一。无论如何,理论上它应该像这样工作:一个实例可以订阅事件,而另一个实例可以发布它。 Redis 会通知订阅的实例。还有 2 个希望有用的链接:redis.io/topics/pubsubrobots.thoughtbot.com/redis-pub-sub-how-does-it-work 否则我认为重点是以某种方式连接 2 个服务器,它们必须通过通道进行通信。还有一些其他的“队列”工具。
      猜你喜欢
      • 2014-02-04
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2013-08-20
      • 2023-03-06
      • 2013-06-12
      • 2017-05-23
      相关资源
      最近更新 更多