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

时间:2018-07-13 19:00:58

标签: azure-service-fabric

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

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

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

我希望您能就此体系结构是否可行提供一些指导。如果没有,讨论为什么它不起作用将很有帮助。欢迎围绕Service Fabric服务与外部设备之间的双向通信限制进行一般性讨论。我希望如果我们可以继续讨论独立群集-我们目前没有计划使用Azure服务。

2 个答案:

答案 0 :(得分:1)

我希望我没事。

关于障碍物:

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

这有两个主要问题:

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

关于WebSockets

这似乎可以通过使用WebSockets实现自定义ICommunicationListenerother things来实现。

答案 1 :(得分:1)

您希望SF托管客户端的任何特殊原因,而不是相反的方式吗?

按照您的建议,我认为您将面临巨大的挑战,要让SF在您的网络上找到这些设备并对其进行跟踪,例如,防火墙,IP,NAT,计划内的维护,故障,连接问题,除非您正在计划手动完成。

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

关于您对通信的担忧,服务结构服务只是您通常在本地计算机上运行的可执行程序,如果可以正常运行,则可能会在前提条件下在服务结构环境中工作,您唯一需要担心的是外部访问群集(如果是天蓝色或网络配置)和服务发现。

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

由于要避免使用Azure,在这种情况下,可以用另一个消息传递平台替换IoT中心,或在服务中实现罗斯桥来处理呼叫。