【问题标题】:RPC style request with MQTT使用 MQTT 的 RPC 样式请求
【发布时间】:2013-12-27 07:02:49
【问题描述】:

使用 MQTT 实现 RPC 样式通信(同步请求/响应)的最佳方式是什么?或者使用另一个接口(例如 REST api)是否有意义?

提前致谢!

【问题讨论】:

    标签: request response rpc synchronous mqtt


    【解决方案1】:

    我一直在寻找一些关于 json-rpc over mqtt 的标准答案以及如何处理主题。人们倾向于引用mqtt-json-rpc,上面写着:

    在内部,远程方法被分配给 MQTT 主题。

    但如果你是这样做的 - 每个方法一个主题 - 那么这将是一个并发问题,除非你采取两个额外的预防措施:首先,必须保证 id 是某种每个请求的 GUID,其次,客户端必须将该 GUID 与其自己的 GUID 进行比较,并丢弃对其他客户端发出的任何请求的响应。无论如何,这些东西可能是个好主意,但 jsonrpc 2.0 规范并没有说明这一点,事实上,可选的鼓励使用事务 ID。

    我认为这是错误的方法,我应该使用每个客户的主题。这样做的方式是使用模式:

    topic:  /rpc/${clientID}/request
    response: /rpc/${clientID}/response
    

    或 主题:/rpc/${clientID}/methodname/request 响应:/rpc/${clientID}/methodname/response

    RPC 服务器将使用通配符进行侦听,匹配该客户端 ID,并将响应发送到正确的管道。不过,我也不确定这是一个好主意。我主要担心的是,我不相信 MQTT 代理真的打算拥有这样的短暂主题。例如,Mosquitto 可以让您在全局范围内打开持久性,但我不确定您发送 QoS=0 是否会绕过持久性,而且我更不确定围绕此的任何行为在许多不同的代理之间的一致性如何。

    【讨论】:

    • 请不要以 / 开头的主题开始,虽然从技术上讲,这是一个非常糟糕的习惯,它会在主题树的开头添加一个额外的 null 并破坏诸如 Shared 之类的内容订阅。
    • 谢谢,@hardillb - 我没有意识到
    【解决方案2】:

    有一些构建在 mqtt 之上的包可以满足你的需求。 node.js 的一个这样的例子是mqtt-json-rpc,它在 Crossbar.io 等其他一些 WAMP 风格的堆栈上模仿 RPC。

    【讨论】:

      【解决方案3】:

      我在我的应用程序中所做的是在我的消息中包含一个响应主题。发件人将使用 uuid 生成一个主题,然后订阅该主题。然后将发送一条包含响应主题的消息,接收者将向该主题发送回复。一旦发送收到回复,它将取消订阅该主题。发送方和接收方都是异步的,但可以执行事务。

      伪代码:

      发件人 生成uuid 订阅(主题=uuid) 味精 = { ... resp_topic:uuid } 发布(主题,味精) 接收者 on_message 主题来自发件人 做一些工作 发布(sender_data['resp_topic'],结果) 发件人 on_message 主题是 resp_topic 得到结果 取消订阅(resp_topic)

      【讨论】:

      • 如果您的服务器实现水平扩展,您的解决方案是否也有效?
      【解决方案4】:

      MQTT 是一个 PUB/SUB 系统,不适合 RPC。虽然您可以在 MQTT 之上硬塞一些东西来模拟所需的同步性,但您最好寻找一个提供真正 RPC 语义的系统。

      也就是说,根据您的应用程序,您可以订阅多个 MQTT 主题并通过发布一个主题并监听第二个主题的响应来模拟往返通信。但请注意,这本质上不是同步的。

      例如,您可以向topic/query 发布一个“问题”,并期望在topic/response 上得到回复。

      【讨论】:

      • 好的,谢谢。有什么我需要注意的吗?关于主题结构、请求 ID 或同步?
      • 我添加了一个小示例,但正如我之前所说,在我看来 MQTT 可能并不非常适合您的用例。 :)
      • 这是一款移动多人游戏。我选择 MQTT 是因为开销小,CPU 和电池压力小。我是分布式计算的初学者,所以它可能不是最好的选择......
      • @Gargamel 将 MQTT 视为网络级 IPC 的最佳方式是为您的应用程序提供最后遗嘱消息传递、消息队列的 QoS 和/或一对多消息。虽然 RPC 调用是多对一消息传递的另一种方式,但应该通过基于 json 的 RESTful API 进行处理。分布式计算更多的是关于 Boinc/OpenMPI/Beowulf/Hadoop 集群系统。即大数据处理。
      猜你喜欢
      • 2020-05-10
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2013-09-15
      • 2012-05-02
      • 1970-01-01
      • 2023-01-20
      相关资源
      最近更新 更多