RabbitMQ中Exchange交换器的类型

在RabbitMQ中,Exchange(交换器)是消息路由的核心组件,它接收生产者发送的消息,并根据不同的规则将消息转发到一个或多个队列

RabbitMQ主要支持以下几种类型的交换器:

1. Direct Exchange(直连交换器)

  • 路由规则 :Direct Exchange根据消息的路由键(routing key)来路由消息。当消息发送到Direct Exchange时,Exchange会将消息发送到与该路由键完全匹配的队列。如果没有匹配的队列,消息将被丢弃(取决于具体配置)。
  • 适用场景:适用于需要**精确匹配**的场景。比如在一个订单处理系统中,根据订单的类型(如普通订单、其他订单)作为路由键,将不同类型的订单消息发送到对应的处理队列。

说明:

  • 生产者发送消息时,会指定一个 routing key(如 normalOrder 或 otherOrder)。
  • 队列通过 Binding Key 绑定,每个队列通过一个 binding key 绑定到 Direct Exchange。
  • 精确匹配路由,Direct Exchange 会将消息的 routing key 与队列的 binding key 进行精确匹配。只有完全匹配的队列才会收到消息。
    • normalOrder 的消息精确匹配了 binding key: normalOrder,因此被路由到Q1队列,由 Consumer_1 消费。
    • otherOrder 的消息精确匹配了 binding key: otherOrder,因此被路由到Q2队列,由 Consumer_2 消费。
    • errorLog 的消息精确匹配了 binding key: errorLog,因此被路由到Q3队列,由 Consumer_3 消费。

2. Topic Exchange(主题交换器)

  • 路由规则 :Topic Exchange支持更灵活的路由匹配 ,它使用通配符来匹配路由键。具体来说,使用 * 匹配一个单词,# 匹配零个或多个单词。路由键是由点(.)分隔的单词序列。比如server.cpu.use 是一个有效的路由键。
  • 适用场景:适用于需要根据消息的主题进行分类路由的场景。比如在一个监控系统中,不同的监控指标(如服务器的CPU使用率、内存使用率,磁盘空间等)可以通过不同的路由键模式进行匹配,将相关消息发送到对应的处理队列。

说明:

  • 所有生产者都向同一个 Topic Exchange 发送消息
  • 队列通过包含通配符(* 匹配一个单词,# 匹配零个或多个单词)的 binding key 绑定到 Topic Exchange。
  • Exchange 将消息的 routing key 与队列的 binding key 进行模式匹配。
  • 消息分发:
    • server.cpu.usage 消息被路由到 Q1 (server.cpu.* 匹配) 和 Q2 (server.# 匹配)。
    • server.memory.high 消息被路由到 Q2 (server.# 匹配)。
    • client.log.error 消息被路由到 Q3 (*.log.error 匹配)。

3. Fanout Exchange(扇形交换器)

  • 路由规则 :Fanout Exchange会将接收到的消息广播到所有与它绑定的队列,而不考虑消息的路由键。无论路由键是什么,所有绑定到该交换器的队列都会收到消息副本。
  • 适用场景:适用于广播消息的场景,例如系统通知。当有新的系统公告时,需要通知所有相关的模块,这些模块对应的队列都绑定到Fanout Exchange,从而都能收到公告消息。

说明:

  • Fanout Exchange 会将接收到的所有消息广播给所有绑定到它的队列。
  • 生产者发送消息时指定的 routing key 会被 Fanout Exchange 完全忽略。
  • 队列绑定到 Fanout Exchange 时,不需要指定 binding key(或者说,指定了也会被忽略)。
  • 同一条消息会被复制并发送到所有绑定的队列中,因此所有连接到这些队列的消费者都会收到相同的消息。

4. Headers Exchange(头部交换器)

  • 路由规则 :Headers Exchange根据消息的headers属性 来路由消息,而不是路由键。当消息发送到Headers Exchange时,Exchange会检查消息的headers属性,并与绑定队列时指定的headers属性进行匹配。如果匹配成功,消息将被发送到该队列。匹配规则有两种:x-match = all 表示所有指定的headers属性都必须匹配;x-match = any 表示只要有一个指定的headers属性匹配即可。
  • 适用场景:Headers Exchange相对较少使用,适用于需要根据消息的headers信息进行复杂路由的场景,比如根据消息的来源、优先级等headers属性进行路由。

说明:

在基于 Headers 路由中,消息的路由不再依赖 routing key,而是依赖消息头(Headers)中的键值对。

绑定参数 (Binding Arguments): 队列绑定到 Exchange 时,需要指定一组键值对作为匹配条件,并且必须包含一个特殊的 x-match 参数。

匹配策略 (x-match):

  • x-match=all: 消息头必须包含所有在绑定参数中指定的键,并且对应的值也要匹配。(AND 逻辑)
  • x-match=any: 消息头至少包含一个在绑定参数中指定的键,并且对应的值也要匹配。(OR 逻辑)

消息分发:

  • P1 的消息 (format=pdf, type=report) 匹配了 Q1 (需要 all) 和 Q3 (需要 any report)。
  • P2 的消息 (type=log, level=error) 仅匹配了 Q2 (需要 all log)。
  • P3 的消息 (format=jpeg, type=image) 仅匹配了 Q3 (需要 any jpeg)。
相关推荐
用户83071968408216 小时前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者2 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者4 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧5 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖5 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农5 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者5 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀5 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3055 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05095 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式