如何处理负载均衡服务器上的 websocket 连接

How to handle wesocket connections on load balanced servers

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

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

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

将托管在 AWS 中。

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

作为 SNS 或 Redis 的替代方案,您可以使用 Kinesis Stream. But before going to that link, read about Apache Kafka,因为 AWS 文档没有很好地解释为什么您将 Kinesis 用于日志摄取以外的任何用途。

总而言之:Kinesis 是一个 "persistent transaction log":您写入的所有内容都会存储一段时间(默认情况下为一天,但您最多可以支付 7 天的费用)并且可供读取任意数量的消费者。

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

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