是否可以将 MQTT 主题的读取分配给多个消费者?

Is it possible to distribute reads of an MQTT topic over multiple consumers?

使用 MQTT 代理,是否可以为一个主题设置多个消费者,以便对于该主题的任何给定消息,只有一个消费者会收到该消息?

那是不可能的。在 MQTT 中,特定主题的所有订阅者都会收到发布到该主题的消息。为了将消息定向到特定订阅者,发布者和订阅者都必须使用与其他订阅者使用的主题不同的特定主题。

简短的回答是否定的,对于任何纯粹实现 MQTT 规范的代理都不是。

我想可以编写一个使用 MQTT 与客户端通信并仅将消息传递给单个订阅者的代理。 (它必须以 QOS2 交付以确保每条消息都被消费)

巧合的是,我在本周早些时候与一位同事谈论了类似的事情,他找到了一种使用 IBM* MQ Light 和名为 'Shared Destinations' 的方法来完成它。 (MQ Light 使用 AMPQ 而不是 MQTT)

https://developer.ibm.com/messaging/mq-light/

  • 完全公开,我在 IBM 工作

更新:

我后来得知 IBM MessageSight v1.2 设备实际上可以使用 MQTT 进行共享目的地 (http://www-03.ibm.com/software/products/en/messagesight)

更新 2:

共享订阅是 MQTT v5 规范的可选部分,因此值得检查任何 v5 代理的选项。

独立于您正在使用的代理,您可以使用 A​​pache Camel 来实现复制来自 主题 A[=24 的所有消息的路由=]到主题B

或者仅复制匹配特定规则(例如用户、内容模式、QoS)的特定邮件。

其他解决方案是使用多协议代理,例如 A​​ctiveMQ,并将特定的消息主题复制到 Queue(队列只能有一个消费者)并使用另一个协议使用队列,例如 JMSSTOMP.

查看共享订阅 https://issues.oasis-open.org/browse/MQTT-234 一些 MQTT 服务器支持它。

EMQTT(开源):

https://github.com/emqtt/emqttd/issues/639#issuecomment-247851593

HiveMQ:

http://www.hivemq.com/blog/mqtt-client-load-balancing-with-shared-subscriptions/

IBM MessageSight:

http://www.ibm.com/support/knowledgecenter/SSCGGQ_1.2.0/com.ibm.ism.doc/Developing/devsharedsubscriptions.html

VerneMQ:

https://vernemq.com/docs/configuration/balancing.html