RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)

RabbitMQ 是一个消息代理系统,使用交换机(Exchange)、队列(Queue)和路由键(Routing Key)来管理消息的传递。它们分别起到不同的作用,构成了消息从生产者到消费者的传递路径。

以下是详细的解释:

1. 交换机(Exchange)

作用

交换机负责接收来自生产者的消息,并根据一定的路由规则将消息分发给一个或多个队列。它是生产者和队列之间的中间层,生产者永远不会直接将消息发送到队列,而是通过交换机。

种类

RabbitMQ 中有几种类型的交换机,每种交换机的消息路由行为都不同:

  • Direct(直连交换机):根据精确匹配路由键(Routing Key)来将消息转发到绑定了相同路由键的队列。
  • Fanout(扇出交换机):不处理路由键,直接将消息广播给绑定到该交换机的所有队列。类似广播机制。
  • Topic(主题交换机):根据路由键的模式匹配(可以使用通配符)将消息路由到符合条件的队列。
  • Headers(头交换机):根据消息的 headers(头部信息)属性来路由,而不是使用路由键。
作用场景

交换机的主要作用是 决定消息应该被发送到哪些队列,每种交换机的类型决定了消息的路由逻辑。


2. 队列(Queue)

作用

队列是消息的实际存储位置。消息被发送到队列后,消费者从队列中取出并处理。队列中的消息按照 先进先出(FIFO) 的顺序被消费者处理。

  • 队列是点对点通信的终点,消费者从队列中拉取消息并处理,每个消息只会被一个消费者处理(除非有特别的广播机制)。
  • 消息可以在队列中持久化(持久化队列),即使 RabbitMQ 服务器重启,消息仍然会保存在队列中。
作用场景

队列的作用是 存储和传递消息。消息在队列中被保存,直到消费者来获取和处理消息。队列可以支持多种消费者,并且保证消息被处理一次且仅一次。


3. 路由键(Routing Key)

作用

路由键是生产者在将消息发送给交换机时提供的一个字符串,用来指定消息的路由路径。交换机会根据路由键的内容,决定该消息应该发送到哪些队列。

  • Direct 交换机 中,路由键用于精确匹配。例如,路由键 task_queue 只会将消息发送到绑定了 task_queue 路由键的队列。
  • Topic 交换机 中,路由键可以使用通配符进行模糊匹配。例如,device.* 可以匹配 device.datadevice.status,但 device.# 可以匹配多个词。
作用场景

路由键的作用是 指定消息传递路径。交换机会根据路由键将消息发送到符合条件的队列。


三者的区别和作用总结

名称 作用和功能 角色 区别
交换机(Exchange) 接收生产者的消息并根据路由键将消息发送到一个或多个队列。交换机本身不保存消息,只负责转发消息。 中间人 决定消息如何分发到不同的队列
队列(Queue) 用于存储消息,等待消费者来处理。消费者从队列中拉取消息进行处理。队列是消息的最终接收点,消息只能在队列中被消费一次。 消费者终点 存储和传递消息
路由键(Routing Key) 生产者指定的一个字符串,用来决定交换机如何将消息路由到队列。路由键可以是精确匹配或模糊匹配(使用通配符)。 消息路由控制 决定消息走向哪些队列

三者之间的关系:

  1. 生产者(Producer) :向 交换机 发送消息,并指定一个 路由键
  2. 交换机(Exchange) :根据绑定的规则和 路由键 ,将消息转发到合适的 队列
  3. 队列(Queue) :消息最终到达 队列,并等待消费者取出并处理。
  4. 消费者(Consumer):从队列中取出消息进行处理。

流程示例:

假设我们有以下 RabbitMQ 配置:

  • 交换机:task_exchange(类型为 Direct)。
  • 队列:task_queue
  • 路由键:task.new.
消息传递过程:
  1. 生产者发送一条消息到 task_exchange,并指定路由键为 task.new
  2. task_exchange 交换机会检查是否有队列绑定了 task.new 路由键。
  3. 如果 task_queue 队列绑定了 task.new 路由键,交换机会将消息发送到 task_queue
  4. 消费者从 task_queue 中拉取消息并进行处理。

这个流程说明了交换机、队列和路由键之间如何协同工作来完成消息的路由和处理。


常见应用场景:

  1. Direct 交换机

    • 用于精确匹配路由键的场景,比如不同的任务类型对应不同的队列,确保消息到达正确的队列。
  2. Fanout 交换机

    • 广播消息给多个消费者,常用于发布/订阅模式,比如推送系统消息给所有消费者。
  3. Topic 交换机

    • 适用于需要根据复杂模式路由消息的场景,比如日志系统,路由键可以根据日志级别(如 errorinfo)路由到不同的队列。

相关推荐
运维&陈同学2 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
时差9532 小时前
Flink Standalone集群模式安装部署
大数据·分布式·flink·部署
菠萝咕噜肉i2 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
只因在人海中多看了你一眼6 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
zhixingheyi_tian8 小时前
Spark 之 Aggregate
大数据·分布式·spark
求积分不加C10 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan052910 小时前
javaer快速上手kafka
分布式·kafka
谭震鸿13 小时前
Zookeeper集群搭建Centos环境下
分布式·zookeeper·centos
天冬忘忧18 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
IT枫斗者1 天前
如何解决Java EasyExcel 导出报内存溢出
java·服务器·开发语言·网络·分布式·物联网