【问题标题】:How to handle wesocket connections on load balanced servers如何处理负载平衡服务器上的 websocket 连接
【发布时间】:2017-10-28 19:45:42
【问题描述】:

我们的 .net 核心网络应用程序目前接受 websocket 连接,并在某些事件(编辑、删除、创建我们的某些实体)上向客户端推送数据。

我们现在想对这个应用程序进行负载平衡,但预见到我们如何处理套接字连接会出现问题。基本上,如果我理解正确的话,只有处理特定事件的节点才会将数据推送到其客户端,而连接到其他节点的客户端都不会获得更新。

普遍接受的处理此问题的方法是什么?我能想到的最好方法是将相同的事件也发送到集群中的所有节点,以便他们也可以更新他们的客户端。这可能吗?我如何知道集群中的其他节点?

将托管在 AWS 中。

【问题讨论】:

    标签: amazon-web-services asp.net-core websocket load-balancing elastic-load-balancer


    【解决方案1】:

    您需要将事件分发到集群中的所有节点,以便它们每个都可以将更新推送到其 websocket 客户端。在 AWS 上执行此操作的常用方法是使用 SNS 将事件分发到所有节点。您也可以为此使用 ElastiCache Redis Pub/Sub。

    【讨论】:

    • 我假设我需要在这里使用 SNS 和 SQS 的组合? SNS 通过 HTTPS 发送事件会再次命中负载均衡器。我如何将它定向到无法从网络访问的特定节点?
    • 我的想法更像是让每台服务器使用它的直接 DNS 名称订阅 SNS 主题,这样 SNS 通知就不会到达负载均衡器,而是直接发送到服务器。 ElastiCache Redis Pub/Sub 可能是一种更简洁的实现,因为所有连接都是从服务器传出的,您不必管理 SNS 订阅。
    • 按照您的建议,我最终选择了 ElastiCache Redis Pub/Sub。对我来说更简单,更干净。感谢您的建议。
    【解决方案2】:

    作为 SNS 或 Redis 的替代方案,您可以使用 Kinesis Stream。但在访问该链接之前,请阅读有关 Apache Kafka 的信息,因为 AWS 文档没有很好地解释您为什么要将 Kinesis 用于日志摄取以外的任何事情。

    总结一下:Kinesis 是一个“持久性事务日志”:您写入其中的所有内容都会存储一段时间(默认情况下为一天,但您最多可以支付 7 天)并且可以读取任意数量的消费者。

    在您的用例中,每个工作进程将在当前的流结束时开始读取,并继续读取(和分发事件)直到关闭。

    我对 Kinesis 的主要问题是没有像 SQS 那样的“长轮询”机制。给定的读取请求可能会或可能不会返回数据。它确实告诉您的是您当前是否处于流的末尾;如果没有,你必须继续阅读,直到你是。当然,如果你读得太快,亚马逊会限制你。因此,您的代码往往会休眠。

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2018-01-03
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多