Websocket 如何将API调用传送到特定的服务结构节点

Websocket 如何将API调用传送到特定的服务结构节点,websocket,architecture,azure-service-fabric,Websocket,Architecture,Azure Service Fabric,我通过Azure Application Gateway公开了一个启用websocket的服务端点,该服务托管在Azure service fabric上。客户端启动与我的端点的websocket连接,并能够交换数据。在某些消息流期间,启用Web套接字的服务使用azure服务总线调用服务结构上承载的其他服务。这些都是以完全异步的方式处理的。一旦其他服务完成处理,它们就会向服务总线发送一条消息,我的WebSocket服务会将其读回。 我遇到的问题是将消息路由回正确的服务结构节点,以便可以将其推回到

我通过Azure Application Gateway公开了一个启用websocket的服务端点,该服务托管在Azure service fabric上。客户端启动与我的端点的websocket连接,并能够交换数据。在某些消息流期间,启用Web套接字的服务使用azure服务总线调用服务结构上承载的其他服务。这些都是以完全异步的方式处理的。一旦其他服务完成处理,它们就会向服务总线发送一条消息,我的WebSocket服务会将其读回。 我遇到的问题是将消息路由回正确的服务结构节点,以便可以将其推回到WebSocket连接另一端的客户端

在下图中,您可以想象每个节点包含多个服务,包括启用web套接字的服务。一旦Websocket服务将消息发布到服务总线,下游服务就开始处理,最后将消息发布回Websocket服务读回的服务总线。在这里,一个随机节点将拾取消息,并且它可能没有相关的websocket连接来将处理后的数据推回


我已经查看了redis pubsub模型,看起来我必须维护节点上处理的最后一条消息。这还意味着,集群上的每个节点都需要读取消息,如果没有与客户端的websocket连接,则需要丢弃消息。我正在寻找针对这类问题的任何建议设计模型

我遇到过类似的情况,不喜欢使用新的外部服务(Redis/SQL Server)作为底板,只需在所有节点上复制每条消息/事件

我确定的解决方案是依靠actor代理的属性,使用actor事件回调无状态服务的特定实例。创建一个actor服务作为发布/订阅背板

和中总结了解决方案。值得指出的是,州演员活动是最好的努力。当应用程序正常运行时,这并不是一个真正的问题,我认为在部署或故障切换期间,某些事件可能会丢失,但是这可以通过额外的工作来缓解


还值得注意的是,负载平衡规则应该保持客户端和后端实例之间的粘性连接。如果您只想对WebSocket应用单独的规则,而不是常规的HTTP通信,则可以为WebSocket创建单独的规则。

我遇到了类似的情况,不喜欢使用新的外部服务(Redis/SQL Server)作为底板,只需在所有节点上复制每条消息/事件

我确定的解决方案是依靠actor代理的属性,使用actor事件回调无状态服务的特定实例。创建一个actor服务作为发布/订阅背板

和中总结了解决方案。值得指出的是,州演员活动是最好的努力。当应用程序正常运行时,这并不是一个真正的问题,我认为在部署或故障切换期间,某些事件可能会丢失,但是这可以通过额外的工作来缓解


还值得注意的是,负载平衡规则应该保持客户端和后端实例之间的粘性连接。如果您只想对WebSocket应用此规则,而不想对常规HTTP通信应用此规则,则可以为WebSocket创建单独的规则。

谢谢您的分享。这看起来是通过外部服务替代pubsub的一个很好的选择。。我会试试这个谢谢分享。这看起来是通过外部服务替代pubsub的一个很好的选择。。我会比你先试试这个解决方案吗?很抱歉反应太晚了。。由于其他一些承诺,我已暂停了这项工作。我倾向于使用可靠的服务分区将调用路由到同一节点。我将在需要转到同一分区的调用中使用公共密钥。如果这对任何人都有帮助,我最终使用azure service bus会话实现了它,以获得SessionId的独占锁。您确定了解决方案吗?抱歉,响应太晚。。由于其他一些承诺,我已暂停了这项工作。我倾向于使用可靠的服务分区将调用路由到同一节点。我将在需要转到同一分区的调用中使用公共密钥。如果它对任何人都有帮助,我最终使用azure service bus会话实现它,以获得会话的独占锁