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)。
相关推荐
搞不懂语言的程序员3 小时前
Kafka Consumer的auto.offset.reset参数有哪些配置?适用场景?
分布式·kafka
洋芋爱吃芋头3 小时前
hadoop中的序列化和反序列化(2)
大数据·hadoop·分布式
不会飞的鲨鱼4 小时前
Scrapy框架之Scrapyd部署及Gerapy分布式爬虫管理框架的使用
分布式·爬虫·scrapy
搞不懂语言的程序员5 小时前
设计一个分布式系统:要求全局消息顺序,如何使用Kafka实现?
分布式·kafka
鱼鱼不愚与5 小时前
处理 Clickhouse 内存溢出
数据库·分布式·clickhouse
曾经的三心草7 小时前
RabbitMQ-springboot开发-应用通信
spring boot·rabbitmq·springboot·java-rabbitmq·应用通信
玄武后端技术栈7 小时前
RabbitMQ如何保证消息不丢失?
分布式·rabbitmq·ruby
小健学 Java7 小时前
Kafka 与 RabbitMQ、RocketMQ 有何不同?
kafka·rabbitmq·rocketmq
Aric_Jones7 小时前
FastDFS,分布式文件存储系统,介绍+配置+工具类
java·数据库·redis·分布式·idea·dfs