首页 > 解决方案 > 即使现在没有订阅者,如何告诉 MQTT 保留消息?

问题描述

在 MQTT 中,如果您发布到没有订阅者的主题,则消息将被丢弃。

虽然这对于经典的 pub/sub 消息传递来说很好,但对于共享订阅(已在 MQTT 5 中引入)来说并不是很好,因为这种模式通常用于某种作业队列,而您通常不希望仅仅因为现在没有工人就放弃工作(也许它刚刚崩溃并正在重新启动)。

是否可以告诉 MQTT 服务器不要丢弃消息,至少对于共享订阅,即使现在没有订阅者?如果是这样,怎么做?

PS:这不仅仅是一个持久会话,因为我不想保留每个客户端的订阅。它更像是一个跨越多个客户端的“持久会话”。

标签: mqtt

解决方案


我不知道是否有任何支持 MQTT v5 共享订阅的代理支持这一点,但我可以预见到它可以以符合 pub/sub 消息传递的规范和精神的方式工作。

MQTT 代理将在 QOS 1 或 2 上为当前离线的客户端订阅主题的消息,并具有持久会话。所以我看不出为什么共享订阅应该有任何不同。我可以看到实现起来可能在技术上有点复杂,但应该是可能的(您需要将共享组视为单个会话)。

也就是说,我认为共享订阅的主要重点是负载平衡,其次是 HA。因此,除非您在同一台机器上运行所有共享订阅者,否则它们不太可能同时失败。


推荐阅读