在RabbitMQ中,Exchange、Queue 和 Topic 是三个焦点概念,它们之间有着密切的关系。理解这些概念及其相互作用对于正确使用RabbitMQ非常重要。下面是对这三个概念的具体解释以及它们之间的关系:
1. Exchange(互换器)
- 界说:互换器是生产者发送消息的目标。它吸收生产者发送的消息,然后根据肯定的规则将消息路由到一个或多个队列中,或者丢弃消息。
- 范例:
- Direct:消息会被路由到那些绑定键与路由键完全匹配的队列。
- Fanout:消息会被广播到所有绑定到该互换器的队列,而不思量路由键。
- Topic:消息会被路由到所有与路由键部分匹配的队列。支持通配符,如 *(匹配一个单词)和 #(匹配零个或多个单词)。
- Headers:不依靠于路由键,而是依靠于消息头属性进行路由。
2. Queue(队列)
- 界说:队列是存储消息的地方。队列是消息的缓冲区,消息从生产者到达队列后,等候消费者消费。
- 特性:
- 长期化:队列可以设置为长期化,如许纵然RabbitMQ重启,队列也不会丢失。
- 排他性:队列可以设置为排他性,即仅限于当前连接使用,连接断开后队列主动删除。
- 主动删除:队列可以设置为主动删除,当最后一个消费者断开连接后,队列主动删除。
3. Topic(主题)
- 界说:主题是一种特殊的路由键,用于在Topic范例的互换器中进行消息路由。主题路由键可以包含多个单词,单词之间用点号.分隔。
- 通配符:
关系
- 生产者:生产者将消息发送到特定的互换器,并指定一个路由键。
- 互换器:互换器根据路由键和绑定规则将消息路由到一个或多个队列。
- 队列:队列吸收并存储消息,等候消费者消费。
- 消费者:消费者从队列中获取并处理消息。
示例
假设我们有一个Topic范例的互换器myTopicExchange,两个队列queue1和queue2,以及以下绑定关系:
- queue1 绑定到 myTopicExchange,绑定键为 topic1.*
- queue2 绑定到 myTopicExchange,绑定键为 topic2.*
生产者发送消息
- rabbitTemplate.convertAndSend("myTopicExchange", "topic1.key1", "Message for topic1");
- rabbitTemplate.convertAndSend("myTopicExchange", "topic2.key2", "Message for topic2");
- rabbitTemplate.convertAndSend("myTopicExchange", "topic1.key2", "Another message for topic1");
复制代码 消息路由
- 消息 "Message for topic1" 路由键为 topic1.key1,匹配 topic1.*,因此会被路由到 queue1。
- 消息 "Message for topic2" 路由键为 topic2.key2,匹配 topic2.*,因此会被路由到 queue2。
- 消息 "Another message for topic1" 路由键为 topic1.key2,匹配 topic1.*,因此也会被路由到 queue1。
消费者吸收消息
- @RabbitListener(queues = "queue1")
- public void receiveMessageFromQueue1(String message) {
- System.out.println("Received from queue1: " + message);
- }
- @RabbitListener(queues = "queue2")
- public void receiveMessageFromQueue2(String message) {
- System.out.println("Received from queue2: " + message);
- }
复制代码 总结
- Exchange 负责吸收消息并根据路由键和绑定规则将消息路由到一个或多个队列。
- Queue 存储消息,等候消费者消费。
- Topic 是一种特殊的路由键,用于在Topic范例的互换器中进行灵活的消息路由。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |