与外部设备双向通信的服务结构策略

Service Fabric Strategies for Bi-Directional Communication with External Devices

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

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

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

希望我理解正确。

关于障碍:

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

这有两个主要问题:

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

关于 WebSockets

这看起来可以通过使用 WebSockets 实现自定义 ICommunicationListener and other things

您希望 SF 托管客户端而不是其他方式的任何特定原因?

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

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

关于您对通信的担忧,Service Fabric 服务只是您通常会在本地计算机上 运行 执行的程序,如果它可以在本地计算机上运行,​​则可能会在本地的 Service Fabric 环境中运行,唯一需要额外注意的是您需要担心的是对集群的外部访问(如果在天蓝色或网络配置中)和服务发现。

在我看来,你应该使用SF作为通信的中心点,每个设备都会连接到SF服务。 另一种方法是使用 Azure IoT Hub to bridge the communication between both. There is a nice Iot Hub + Service Fabric Sample 可能适合您的需要。

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