首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >发送PUBACK数据包时的MQTT代理

发送PUBACK数据包时的MQTT代理
EN

Stack Overflow用户
提问于 2021-09-25 08:36:44
回答 1查看 415关注 0票数 0

假设有一个mqtt代理,一个主题在QoS 1有10000订阅者,名为topic_A .Now one publisher在topic_A上发布消息,代理如何处理此消息?我想出一种方法是:

  • 1.保存消息
  • 2.将PUBACK发送给publisher
  • 3.向10000用户发送消息
    • 3.1保存一个用户的消息
    • 3.2向一个订阅者发布
    • 3.3等待订阅者的公开消息
    • 3.4删除3.1中保存的消息

  • 4.删除1中保存的消息

但是在第3步中,假设代理机器被关闭,此时1000个订阅者推送完成(3.4完成),4000个订阅者正在等待PUBACK(3.3),5000个订阅者尚未开始推送(尚未启动3.1).After,此时代理重新启动,如何处理这种情况?如何设置发布DUP flag?在代理重启后,第一个1000名被保险人需要再推一次吗?

EN

回答 1

Stack Overflow用户

发布于 2021-09-25 23:22:50

MQTT规范提供了关于应该如何做到这一点的指导:

当服务器获得传入应用程序消息的所有权时,它必须将其添加到具有匹配订阅的客户端的会话状态。匹配规则在4.7节中定义。

会话状态

会话的存在,即使会话状态的其余部分为空。 ·客户的订阅。 ·QoS 1和QoS 2消息已经发送到客户端,但尚未被完全确认为。 ·QoS 1和QoS 2消息等待发送到客户端。 ·QoS 2消息已从客户端接收,但尚未得到完全确认。 ·可选地,将QoS 0消息挂起传输到客户端。

因此,当服务器接收到消息时,它实际上将其添加到每个具有匹配订阅的客户端的队列中(如果当前连接了该客户端,则可以立即发送该消息)。需要注意的是,虽然发送给每个客户端的消息体是相同的,但是消息头可能不同(不同的消息ID,可能是不同的QOS等),而且服务器必须遵守围绕消息排序的规则。服务器知道由于会话状态,消息是否已经发送到客户端,这意味着它可以适当地添加DUP标志。

我认为可能值得指出您提议的算法中的一些缺点,因为它有助于解释使用上述过程的原因:

  • 并行发送消息的效率要高得多;接收PUB,同时向所有订阅的客户端发送PUB (服从订购规则)。
  • 如果一个客户端在消息传入时断开连接(cleansession = 0),则需要在消息重新连接时传递该消息(您的算法并不真正支持这一点)。
  • 如果一个客户端没有响应,那么交付给其他客户端就会延迟。
  • 服务器将如何协调来自多个客户端的一个主题的消息(记住消息排序很重要)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69324482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档