在RabbitMQ中四种常见的消息路由模式

1. Fanout模式

Fanout模式的交换机是扇出交换机Fanout Exchange),它会将消息广播给所有绑定到它的队列,而不考虑消息的内容或路由键。

工作原理:
  • 生产者 发送消息到Fanout Exchange
  • Fanout Exchange会将消息广播给所有绑定到它的队列,所有绑定的队列都会收到这条消息。
  • 消费者监听绑定的队列,处理收到的消息。
特点:
  • 没有路由键:消息不需要路由键,所有绑定的队列都会接收到消息。
  • 广播机制:消息会被广播到所有与交换机绑定的队列,而不管消息内容。
应用场景:
  • 广播系统消息:适合需要通知多个服务模块或系统节点的场景。
  • 日志系统:将日志消息广播到多个日志处理服务。
java 复制代码
exchange_type = 'fanout'
exchange = channel.exchange_declare(exchange='logs', exchange_type=exchange_type)

2. Direct模式

Direct模式使用直连交换机Direct Exchange),通过消息的**路由键(Routing Key)**来精确匹配队列。如果生产者的消息路由键和队列绑定的路由键相同,消息就会被分发到该队列。

工作原理:
  • 生产者 发送带有路由键的消息到Direct Exchange
  • Direct Exchange根据消息的路由键,将消息精确地分发给绑定了相同路由键的队列。
  • 消费者监听对应的队列,处理符合路由键的消息。
特点:
  • 精确路由:消息根据路由键精确匹配队列。
  • 一对一或多对一:不同队列可以绑定不同的路由键,确保只有匹配的队列收到消息。
应用场景:
  • 日志系统:将不同级别的日志(info、error、warning)发送到不同的日志处理队列。
  • 分布式任务:根据任务类型(如task_type_1task_type_2)精确分发任务
java 复制代码
exchange_type = 'direct'
exchange = channel.exchange_declare(exchange='direct_logs', exchange_type=exchange_type)

# Binding with specific routing key
channel.queue_bind(exchange='direct_logs', queue='error_logs', routing_key='error')

3. Topic模式

Topic模式使用主题交换机Topic Exchange),允许使用通配符进行消息路由。消息的路由键由一个点分隔的字符串 组成,队列可以通过通配符绑定到交换机,实现模糊匹配。

工作原理:
  • 生产者 发送带有路由键的消息到Topic Exchange,路由键由点分隔的多个单词组成,例如"logs.info", "user.create", "order.payment.success".
  • 队列 绑定到Topic Exchange时,可以使用通配符匹配多个路由键:
    • *匹配一个单词。
    • #匹配零个或多个单词。
  • 消费者监听队列,接收符合通配符规则的消息。
特点:
  • 模糊匹配:消息根据路由键的模式进行模糊匹配。
  • 灵活路由:支持复杂的路由需求,允许将相似类别的消息路由到同一个队列。
应用场景:
  • 消息分类处理:适合需要对复杂系统中的消息进行分类的场景,比如基于用户操作类型、订单状态等。
  • 多模块事件处理:可以为不同的模块创建灵活的订阅机制。
java 复制代码
exchange_type = 'topic'
exchange = channel.exchange_declare(exchange='topic_logs', exchange_type=exchange_type)

# Binding queue with topic patterns
channel.queue_bind(exchange='topic_logs', queue='system_logs', routing_key='logs.*')
channel.queue_bind(exchange='topic_logs', queue='all_logs', routing_key='#')

4. 头部模式

头部模式使用头部交换机Headers Exchange),不同于Direct和Topic模式,它不是通过路由键来路由消息,而是通过消息的头部属性来路由。队列绑定到交换机时会指定一组头部键值对,只有当消息的头部属性匹配这些键值对时,消息才会被路由到相应的队列。

工作原理:
  • 生产者 发送带有头部属性的消息到Headers Exchange
  • 队列 绑定到Headers Exchange时,会指定匹配条件(例如x-match=all表示所有头部键值对都必须匹配,x-match=any表示只要有一个匹配即可)。
  • 交换机根据头部属性将消息分发给符合条件的队列。
特点:
  • 基于头部字段路由:不依赖路由键,消息的头部属性决定消息的路由。
  • 更复杂的路由逻辑:适合需要根据多种属性组合来路由的场景。
应用场景:
  • 消息过滤:适合需要根据消息的多个属性来进行复杂过滤的场景,比如需要根据来源、优先级等多个条件筛选消息。
  • 高度灵活的路由逻辑:当单纯依赖路由键不足以满足需求时,使用头部模式更合适。
java 复制代码
exchange_type = 'headers'
exchange = channel.exchange_declare(exchange='header_logs', exchange_type=exchange_type)

# Binding queue with header matching criteria
channel.queue_bind(exchange='header_logs', queue='error_logs', arguments={'x-match': 'all', 'type': 'error', 'format': 'json'})
相关推荐
字节程序员1 小时前
Jmeter分布式压力测试
分布式·jmeter·压力测试
ProtonBase1 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
时时刻刻看着自己的心2 小时前
clickhouse分布式表插入数据不用带ON CLUSTER
分布式·clickhouse
Data跳动10 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
Java程序之猿12 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
来一杯龙舌兰12 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
节点。csn14 小时前
Hadoop yarn安装
大数据·hadoop·分布式
NiNg_1_23415 小时前
基于Hadoop的数据清洗
大数据·hadoop·分布式
隔着天花板看星星16 小时前
Spark-Streaming集成Kafka
大数据·分布式·中间件·spark·kafka
技术路上的苦行僧21 小时前
分布式专题(8)之MongoDB存储原理&多文档事务详解
数据库·分布式·mongodb