【问题标题】:How to tell MQTT to keep messages even if there is no subscriber right now?即使现在没有订阅者,如何告诉 MQTT 保留消息?
【发布时间】:2019-06-27 10:00:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您找到解决问题的方法了吗?如果是这样,请与我们分享。就我而言,我面临同样的问题,这是我在 MQTT 和 Kafka 之间进行选择的关键因素。
  • 很遗憾,没有……事实上,我们放弃了 MQTT,因为它还有其他缺点,而是为此构建了一个自定义解决方案。

标签: mqtt


【解决方案1】:

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

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

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

【讨论】:

  • 我在这里看到的主要问题不是所有的worker都宕机了,而是worker和broker之间的网络宕机了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多