【问题标题】:Request response pattern with mosca MQTT使用 mosca MQTT 的请求响应模式
【发布时间】:2020-05-10 07:55:44
【问题描述】:

有没有办法使用 mosca MQTT 实现请求-响应模式以“检查来自客户端的回复,如果我在预期时间内没有收到预期的回复,则重新发布”。

我相信这在 Mqtt 5 中是可能的,但到目前为止,我必须使用具有 QoS 1 的 Mosca 代理(支持到 Mqtt 3.1.1)

我正在寻找一种 Node js 解决方法来实现这一点。

【问题讨论】:

  • 您可以使用任何 MQTT 代理实现请求-响应模式,但在 v5 之前,您需要自己实现(要么有一个回复主题和一个消息 ID,要么包含一个特定的每条消息中的回复主题)。即使使用 MQTT v5,您也需要自己实现空闲超时位。请注意,如果您使用的是 QOS 1/2,那么代理将负责重新发送消息(直到它接收到 PUBACK/PUBCOMP),因此重新发送消息可能会适得其反(当通信链接关闭时,许多相同的消息排队等候) .
  • @Brits 谢谢。您是否有任何参考来使用 MQTT(不是 MQTT v5)实现请求 - 响应模式

标签: node.js mqtt message-queue publish-subscribe mosca


【解决方案1】:

根据我的评论,您可以使用任何 MQTT 代理实现请求-响应模式,但在 v5 之前,您需要自己实现这一点(要么有一个回复主题和一个消息 ID,要么包含一个特定的回复-到每条消息中的主题)。

因为 MQTT 3.11 本身不直接提供此功能,并且 MQTT 有效负载没有标准格式(只有一些字节!),所以不可能提出通用实现(在要求)。这在 MQTT v5 中通过包含properties 的能力得到解决,包括Response TopicCorrelation Data。对于早期版本,您只能在有效负载中添加一些额外信息(使用您选择的任何编码机制)。

有一些 Stack Overflow 问题可能会提供一些见解:

其他文章:

这里有几个节点包(注意:这些已经有一段时间没有更新了,我也没有查看代码):

即使使用 MQTT v5,您也需要自己实现空闲超时位。如果您使用的是 QOS 1/2,那么代理将负责重新发送消息(直到它接收到 PUBACK/PUBCOMP),因此重新发送消息可能会适得其反(当通信链路断开时,许多相同的消息排队等候)

【讨论】:

  • 感谢您的精彩参考。我开始在代理端实现请求-响应模式。我已将该方法添加为同一问题的答案
【解决方案2】:

我做过的工作流程总结

  • 为每条消息添加“相关 ID”
  • 预期的回复作为请求有效负载存储在 Redis 中(请求与 Correlation Id 作为键)来比较来自客户端的响应。
  • 如果预期消息为 相当于预期的响应主题和负载。
  • 超时使用节点 cron 作业来处理来自客户端的每个响应 服务器。

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2022-08-18
    • 2018-10-07
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多