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

Amazon web services 如何在负载平衡的服务器上处理wesocket连接,amazon-web-services,asp.net-core,websocket,load-balancing,elastic-load-balancer,Amazon Web Services,Asp.net Core,Websocket,Load Balancing,Elastic Load Balancer,我们的.net核心web应用程序目前接受websocket连接,并在某些事件(编辑、删除、创建我们的一些实体)上将数据推送到客户端 我们希望现在就对此应用程序进行负载平衡,但预见到如何处理套接字连接的问题。基本上,如果我理解正确,只有处理特定事件的节点才会将数据推送到它的客户端,而连接到其他节点的客户端都不会得到更新 什么是处理这个问题的公认方法?我能想到的最好的方法是将相同的事件发送到集群中的所有节点,以便它们也可以更新其客户端。这可能吗?我如何知道集群中的其他节点 将托管在AWS中。您需要将

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

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

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


将托管在AWS中。

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

作为SNS或Redis的替代方案,您可以使用。但是在转到该链接之前,请先阅读相关内容,因为AWS文档没有很好地解释为什么除了日志摄取之外,您还需要使用Kinesis

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

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


我对动觉的主要问题是,没有像SQS那样的“长轮询”机制。给定的读取请求可能返回数据,也可能不返回数据。它告诉你的是你现在是否在这条流的尽头;如果没有,你必须一直阅读直到你成功。当然,如果你阅读速度太快,亚马逊会限制你。因此,您的代码往往会出现休眠。

我假设这里需要结合使用SNS和SQS?SNS通过HTTPS发送事件将再次命中负载平衡器。如何将其定向到无法从web访问的特定节点?我的想法更像是让每台服务器使用其直接DNS名称订阅SNS主题,以便SNS通知不会命中负载平衡器,而是直接转到服务器。ElastiCache Redis Pub/Sub可能是一个更干净的实现,因为所有连接都是从服务器传出的,您不必管理SNS订阅。我最终按照您的建议使用ElastiCache Redis Pub/Sub。对我来说更简单更干净。谢谢你的建议。