如何处理负载平衡服务器上的wesocket连接

时间:2017-10-24 14:58:32

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

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

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

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

将在AWS中托管。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

作为SNS或Redis的替代方案,您可以使用Kinesis Stream。但在转到该链接之前,请先阅读Apache Kafka,因为AWS文档并没有很好地解释为什么您将Kinesis用于除日志摄取之外的任何其他内容。

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

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

我与Kinesis的主要问题是没有"长期民意调查"与SQS一样的机制。给定的读取请求可能会也可能不会返回数据。它告诉你的是你目前是否在流的最后;如果没有,你必须继续阅读,直到你。当然,如果你读得太快,亚马逊会扼杀你。因此,您的代码往往会有睡眠。