【问题标题】:How to funnel an API call to a specific service fabric node如何将 API 调用集中到特定的服务结构节点
【发布时间】:2020-08-10 15:55:53
【问题描述】:

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

在下图中,您可以想象每个节点包含多个服务,包括启用 Web 套接字的服务。一旦 Websocket 服务向服务总线发送消息,下游服务就会开始处理,最后它们会将消息发送回服务总线,Websocket 服务会读回该消息。在这里,一个随机节点将接收消息,它可能没有相关的 websocket 连接来推回处理过的数据 Sample Design

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

【问题讨论】:

  • 您确定了解决方案吗?
  • 抱歉,回复晚了。由于其他一些承诺,我已将这项工作搁置。我倾向于使用可靠的服务分区将呼叫路由到同一个节点。我将在需要继续到同一分区的调用中使用公共密钥。
  • 如果它对任何人有帮助,我最终使用 azure service bus 会话来实现它以获取会话的独占锁定

标签: websocket architecture azure-service-fabric


【解决方案1】:

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

我确定的解决方案是依靠演员代理的属性,使用演员事件回调到无状态服务的特定实例。创建一个参与者服务来充当发布/订阅背板。

解决方案总结在this blog postthis GitHub repo。值得指出的是,documentation 状态 actor 事件是尽力而为。当应用程序正常运行时,这并不是真正的问题,我认为在部署或故障转移期间,某些事件可能会丢失,但是可以通过额外的工作来缓解这种情况。

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

【讨论】:

  • 谢谢分享。这看起来是通过外部服务替代 pubsub 的一个很好的选择。我会试试这个
猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2019-11-11
  • 2017-08-03
  • 2019-03-20
  • 2020-11-03
相关资源
最近更新 更多