当前位置: 首页 > article >正文

rabbitmq exchange queue topic的关系

在RabbitMQ中,ExchangeQueueTopic 是三个核心概念,它们之间有着密切的关系。理解这些概念及其相互作用对于正确使用RabbitMQ非常重要。下面是对这三个概念的详细解释以及它们之间的关系:

1. Exchange(交换器)

  • 定义:交换器是生产者发送消息的目标。它接收生产者发送的消息,然后根据一定的规则将消息路由到一个或多个队列中,或者丢弃消息。
  • 类型
    • Direct:消息会被路由到那些绑定键与路由键完全匹配的队列。
    • Fanout:消息会被广播到所有绑定到该交换器的队列,而不考虑路由键。
    • Topic:消息会被路由到所有与路由键部分匹配的队列。支持通配符,如 *(匹配一个单词)和 #(匹配零个或多个单词)。
    • Headers:不依赖于路由键,而是依赖于消息头属性进行路由。

2. Queue(队列)

  • 定义:队列是存储消息的地方。队列是消息的缓冲区,消息从生产者到达队列后,等待消费者消费。
  • 特性
    • 持久化:队列可以设置为持久化,这样即使RabbitMQ重启,队列也不会丢失。
    • 排他性:队列可以设置为排他性,即仅限于当前连接使用,连接断开后队列自动删除。
    • 自动删除:队列可以设置为自动删除,当最后一个消费者断开连接后,队列自动删除。

3. Topic(主题)

  • 定义:主题是一种特殊的路由键,用于在Topic类型的交换器中进行消息路由。主题路由键可以包含多个单词,单词之间用点号.分隔。
  • 通配符
    • *:匹配一个单词。
    • #:匹配零个或多个单词。

关系

  • 生产者:生产者将消息发送到特定的交换器,并指定一个路由键。
  • 交换器:交换器根据路由键和绑定规则将消息路由到一个或多个队列。
  • 队列:队列接收并存储消息,等待消费者消费。
  • 消费者:消费者从队列中获取并处理消息。

示例

假设我们有一个Topic类型的交换器myTopicExchange,两个队列queue1queue2,以及以下绑定关系:

  • 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类型的交换器中进行灵活的消息路由。

http://www.kler.cn/a/410100.html

相关文章:

  • 传统经验光照模型
  • Linux应用编程(C语言编译过程)
  • 241124学习日志——[CSDIY] [ByteDance] 后端训练营 [14]
  • pringboot自动装配原理是?
  • linux基本命令2
  • 使用树莓派安装shairport-sync使老音响变身AirPlay音响
  • 前端---HTML(一)
  • 【CSP CCF记录】201809-2第14次认证 买菜
  • SpringMVC-03-HelloSpring
  • 人工智能之数学基础:线性代数在人工智能中的地位
  • HttpServletRequest req和前端的关系,req.getParameter详细解释,req.getParameter和前端的关系
  • docker 安装arm架构mysql8
  • 全面解读RuoYi 系列项目不同版本与应用场景
  • Java中的集合体系
  • 问题记录-Java后端
  • STM32端口模拟编码器输入
  • docker部署springboot、挂载配置文件
  • 241125学习日志——[CSDIY] [ByteDance] 后端训练营 [15]
  • 代谢组数据分析(二十二):Zscore标准化后主成分分析(PCA)及热图展示
  • vue中el-table合并单元格
  • 【论文解析】HAQ: Hardware-Aware Automated Quantization With Mixed Precision
  • 深入解析常见的设计模式
  • 三种蓝牙架构实现方案
  • python基础练习
  • ThingsBoard安装测试
  • 学习python的第十三天之函数——函数传参中的传值和传址问题