【问题标题】:Service Fabric Strategies for Bi-Directional Communication with External Devices用于与外部设备进行双向通信的 Service Fabric 策略
【发布时间】:2018-07-16 20:06:09
【问题描述】:

我的公司有兴趣使用独立的 Service Fabric 集群来管理与机器人的通信。在我们的场景中,每个机器人都将托管自己的rosbridge 服务器,而我们的 Service Fabric 应用程序将为每个机器人维护 WebSocket 客户端。我设想一个有状态的服务沿着设备 id 分区,它在启动时打开连接。它应该通过心跳监控连接健康状况,将消息从机器人传递到某些协议网关服务,并监听其他服务以将消息传递给机器人。

我没有在 Service Fabric 文档中看到关于这种外部通信方式的讨论 - 我不知道这是不是因为:

  • 从 Service Fabric 以这种方式管理 WebSocket(或任何双向网络协议)没有特殊注意事项。我没有看到关于限制的讨论,也没有看到任何理由,从概念上讲,我为什么不能这样做。我最初认为复制会出现问题(重复消息?),但由于任何时候只有一个副本可以是主副本,这似乎不是问题。
  • Service Fabric 不适合与外部设备进行双向通信

对于这种架构是否可行的一些指导,我将不胜感激。如果没有,讨论为什么它不起作用会很有帮助。欢迎对 Service Fabric 服务和外部设备之间的双向通信限制进行一般性讨论。如果我们可以继续讨论独立集群,我更愿意 - 我们目前没有使用 Azure 服务的计划。

【问题讨论】:

  • 您是否有任何特定理由使用 Service Fabric 而不是 WebApp?
  • 我们有兴趣在某些情况下使用可靠的集合进行存储。我们喜欢 Service Fabric 的可扩展性和可靠性。虽然此时不使用 Azure,但我们最终希望出售托管在 Azure 中的项目。我们喜欢 Service Fabric,因为我们可以在云和独立托管模型之间进行选择,同时保持类似的部署流程。

标签: azure-service-fabric


【解决方案1】:

您希望 SF 托管客户端而不是相反的任何特定原因?

按照您建议的方式,我认为您将面临巨大的挑战,让 SF 在您的网络上找到这些设备并跟踪它们,例如防火墙、IP、NAT、计划维护、故障、连接问题,除非您打算手工做。

从我在您提供的有关 rosbridge 服务器的文档中看到的简短描述中,我可以理解您必须将它托管在服务器上(就像使用服务结构服务一样)并且您的设备将连接到它,在此在这种情况下,您的设备会安装 ROS 来进行这种通信。

关于您对通信的担忧,Service Fabric 服务只是您通常会在本地机器上运行的可执行程序,如果它在那里工作,则可能会在本地的 Service Fabric 环境中工作,您唯一需要担心的是对集群的外部访问(如果在 Azure 或网络配置中)和服务发现。

在我看来,您应该使用 SF 作为通信的中心点,每个设备都会连接到 SF 服务。 另一种方法是使用Azure IoT Hub 来桥接两者之间的通信。有一个不错的 Iot Hub + Service Fabric Sample 可能适合您的需求。

因为您想避免使用 Azure,所以在这种情况下,您可以将 IoT Hub 替换为另一个消息传递平台,或者在您的服务中实现 rosbridge 来处理调用。

【讨论】:

  • 到目前为止,我与 rosbridge 的交互是机器人本身运行 rosbridge 服务器并且我的服务必须作为客户端连接到它的情况。我的公司是集成商,因此我们无法控制这些设备 - 我同意设备发现是一个问题,如果 SF 可以监听传入连接会更好。这时候我准备用手动注册来管理它。
  • 在这种情况下,您应该可以使用 SF。我给你的唯一建议是在规划这些 Statuful Services 时要小心,因为你知道每个服务可能有多个副本并且只有一个主副本,辅助节点可能会被提升为主节点,并且你的代码应该正确处理它。跨度>
【解决方案2】:

我希望我理解正确。

关于障碍:

我认为这里的主要问题是服务副本和机器人之间可以建立双向连接。

这有两个主要问题:

  1. 只有主副本具有写入权限 - 即只有一个副本能够修改状态。因此,可以通过为每个机器人创建单独的分区(但请记住,您无法在创建服务后更改分区计数)或通过为每个机器人创建单独的服务实例(这将允许您动态添加或删除机器人,但需要与服务可发现性相关的额外逻辑)。
  2. 副本可能因各种原因关闭(终止)、移动到另一个节点(关闭并启动新副本)甚至降级(主副本获取降级为辅助副本,另一个辅助副本获取提升为主副本)。所以服务代码和机器人通信代码应该可以处理这个问题。

关于 WebSockets

这看起来可以通过使用 WebSocket 实现自定义 ICommunicationListenerother things

【讨论】:

  • 你能扩展ICommunicationListener的用例吗?此架构中的 SF 将托管 websocket 客户端,而不是侦听器(机器人将侦听来自我的连接 - 我无法控制它,但听起来很落后)。在这种情况下,因为我不需要让命名服务发现任何 URI,所以需要 ICommunicationListener 吗?这就是为什么我认为复制没有问题 - 如果客户端生命周期是在有状态服务的 RunAsync 方法中管理的,那么机器人应该只会在主节点移动时看到一系列关闭和打开的连接。
  • @FolksymAndrew 看起来我误解了谁是客户 :) 是的,在您描述的架构中,不需要ICommunicationListener。在RunAsync 中建立连接听起来也很合理。然后主要是处理stateful service lifecycle以正确打开和关闭与机器人的连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2012-02-14
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多