mqtt - 即使现在没有订阅者,如何告诉 MQTT 保留消息?
问题描述
在 MQTT 中,如果您发布到没有订阅者的主题,则消息将被丢弃。
虽然这对于经典的 pub/sub 消息传递来说很好,但对于共享订阅(已在 MQTT 5 中引入)来说并不是很好,因为这种模式通常用于某种作业队列,而您通常不希望仅仅因为现在没有工人就放弃工作(也许它刚刚崩溃并正在重新启动)。
是否可以告诉 MQTT 服务器不要丢弃消息,至少对于共享订阅,即使现在没有订阅者?如果是这样,怎么做?
PS:这不仅仅是一个持久会话,因为我不想保留每个客户端的订阅。它更像是一个跨越多个客户端的“持久会话”。
解决方案
我不知道是否有任何支持 MQTT v5 共享订阅的代理支持这一点,但我可以预见到它可以以符合 pub/sub 消息传递的规范和精神的方式工作。
MQTT 代理将在 QOS 1 或 2 上为当前离线的客户端订阅主题的消息,并具有持久会话。所以我看不出为什么共享订阅应该有任何不同。我可以看到实现起来可能在技术上有点复杂,但应该是可能的(您需要将共享组视为单个会话)。
也就是说,我认为共享订阅的主要重点是负载平衡,其次是 HA。因此,除非您在同一台机器上运行所有共享订阅者,否则它们不太可能同时失败。
推荐阅读
- gerrit - 如何将 Gerrit 草稿提交提升为常规代码审查提交
- kdb - 比较两个不同实例中的表
- sql-server-2016 - 将 .dbf 文件从本地系统读取/导入到 SQL Server 2016 64 位的命令
- python - 使用 Python Pandas 循环将不同的 .csv 文件读入不同的数据帧
- module - 我应该如何访问模块中的其他模块?
- mysql - 在 MySQL 中选择直到
- node.js - 在不同模型上带有续集的生命周期钩子
- spring - 使用 Java 10 的 Gradle(即使包未导出,Spring 也能够扫描模块类)
- c# - 使用 IText 7 将 PDF 转换为 PDF/A?
- c# - 阻止文本框 UWP 的不同方法