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_1
或task_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'})