在第一个订阅者读取后删除MQTT消息

时间:2017-11-09 09:44:14

标签: java jboss mqtt

有没有办法在第一个订阅者收到MQTT消息之后从其主题中删除它,以便其他订阅者无法读取它?
要弄清楚这个奇怪的问题:
我必须处理四个JBoss实例(我必须承认我绝对不对这个架构负责)。它们是彼此的镜子。因此,他们每个人都运行一个订阅特定主题的工作。来自此主题的消息将保留在数据库中。我必须避免的是,相同的消息被持续四次。所以我的想法是在这个主题上创造竞争条件。读取消息的第一个作业删除它,以便其他作业不接收它。 这可能吗?

2 个答案:

答案 0 :(得分:3)

排序答案否,你不能"删除"消息一旦发布,经纪人几乎会立即发送给所有订户。

更长的答案,您正在寻找的是一种称为共享订阅的东西。这允许一组客户端有效地将主题订阅为单个单元,并且仅将消息传递给该组中的一个。这用于负载平衡。共享订阅将作为v5的一部分添加到MQTT规范中。

目前,许多经纪人已经实现了这一功能(每个经纪人实施的功能略有不同,因此您无法在代理实施之间无缝切换,直到v5)作为增值功能。我相信以下经纪人有一些版本的共享订阅支持,可能还有更多:

  • HiveMQ
  • IBM Message Sight设备
  • vernemq

答案 1 :(得分:0)

如果订阅的主要目的是将数据保留在DB中,那么您应该通过API调用或直接代码集成来查看MQTT Broker后端的钩子以获取数据并存储它。

当您使用QoS 2进行完美存储(如问题中所述)或在使用QoS 1或使用QoS 0时丢失数据时在重负载下进行复制时,订阅始终可能是开销。