假设有一个mqtt代理,一个主题在QoS 1有10000订阅者,名为topic_A .Now one publisher在topic_A上发布消息,代理如何处理此消息?我想出一种方法是:
但是在第3步中,假设代理机器被关闭,此时1000个订阅者推送完成(3.4完成),4000个订阅者正在等待PUBACK(3.3),5000个订阅者尚未开始推送(尚未启动3.1).After,此时代理重新启动,如何处理这种情况?如何设置发布DUP flag?在代理重启后,第一个1000名被保险人需要再推一次吗?
发布于 2021-09-25 23:22:50
MQTT规范提供了关于应该如何做到这一点的指导:
当服务器获得传入应用程序消息的所有权时,它必须将其添加到具有匹配订阅的客户端的会话状态。匹配规则在4.7节中定义。
会话状态由
会话的存在,即使会话状态的其余部分为空。 ·客户的订阅。 ·QoS 1和QoS 2消息已经发送到客户端,但尚未被完全确认为。 ·QoS 1和QoS 2消息等待发送到客户端。 ·QoS 2消息已从客户端接收,但尚未得到完全确认。 ·可选地,将QoS 0消息挂起传输到客户端。
因此,当服务器接收到消息时,它实际上将其添加到每个具有匹配订阅的客户端的队列中(如果当前连接了该客户端,则可以立即发送该消息)。需要注意的是,虽然发送给每个客户端的消息体是相同的,但是消息头可能不同(不同的消息ID,可能是不同的QOS等),而且服务器必须遵守围绕消息排序的规则。服务器知道由于会话状态,消息是否已经发送到客户端,这意味着它可以适当地添加DUP标志。
我认为可能值得指出您提议的算法中的一些缺点,因为它有助于解释使用上述过程的原因:
cleansession = 0),则需要在消息重新连接时传递该消息(您的算法并不真正支持这一点)。https://stackoverflow.com/questions/69324482
复制相似问题