问题描述
在这里,我将解释我想要的用例:
- 我在设备连接到代理之前为mqtt客户端( mqtt-subscription-client1qos1 )创建了持久队列。交流( amp.topic )
- 我为该队列( topic1 , topic2 )创建了一些绑定
- 我发送了1条消息到 topic1 (使用amqp)
- 我通过amqp向 topic2 发送了1条消息
- 然后使用MQTT客户端设置client =“ client1 ”,我使用相同的交换器( amp.topic )连接到“ topic1 ”
我想收到多少条消息?我期望1,但是我得到2,我不确定我是否测试正确,或者这是否是预期的行为。
非常感谢您的帮助
解决方法
在RabbitMQ设计的AMQP中,消息始终发布到交换,根据路由键和绑定进行路由,并从队列。
在MQTT中,消息将发布到经纪人,根据主题进行路由,并通过订阅进行使用。
RabbitMQ MQTT plugin将这些概念映射在一起:
- MQTT 经纪人是由单个交易所 模拟
- MQTT 主题用作路由键
- MQTT 订阅是从该交换到队列的绑定
- 最后,每个MQTT 客户端都有一个队列,可以从中接收其订阅的消息
这里的关键是,这些只是普通的RabbitMQ交换和队列,用于模拟MQTT模型-消息可以由代理路由到任何队列,而来自其他代理的消息可以路由到队列,它们不需要与您在MQTT中定义的主题相关。
因此,如果您手动将消息路由到特定MQTT客户端的队列中,RabbitMQ会将其与该队列中的其他消息一起传递到客户端。订阅客户端的“主题”没有任何区别,因为这仅用于在服务器上设置绑定。