Striveonger

vuePress-theme-reco Mr.Lee    2015 - 2026
Striveonger Striveonger
主页
分类
  • 笔记
  • 文章
  • 工具
  • 读书/工具
标签
时间轴
简历
author-avatar

Mr.Lee

274

Article

145

Tag

主页
分类
  • 笔记
  • 文章
  • 工具
  • 读书/工具
标签
时间轴
简历

RabbitMQ 交换机的路由规则

vuePress-theme-reco Mr.Lee    2015 - 2026

RabbitMQ 交换机的路由规则

Mr.Lee 2026-03-31 00:00:23 RabbitMQ

RabbitMQ 中不同交换机的路由规则

在 RabbitMQ 中,这四种交换机(Exchange)的核心区别在于路由规则不同——即它们如何将消息从生产者路由到绑定的队列中。

以下是它们的具体功能、区别及使用场景:

# 1. Fanout(扇形交换机)

  • 功能:这是最简单的模式。它会将收到的消息广播到所有绑定的队列中,完全忽略路由键(Routing Key)。
  • 不同点:不进行任何匹配,只负责复制分发。
  • 使用场景:
    • 广播通知:比如用户登录后,需要同时更新缓存、发送欢迎邮件、记录日志。只需将消息发往 Fanout 交换机,所有下游系统都能同时收到。
    • 多端同步:当需要所有微服务实例都刷新本地缓存时。

# 2. Direct(直连交换机)

  • 功能:根据路由键(Routing Key)进行精确匹配。只有当消息的路由键与队列绑定的路由键完全一致时,消息才会被投递到该队列。
  • 不同点:点对点、单播或多播的精确控制。
  • 使用场景:
    • 任务分发:比如有“处理订单”和“处理退款”两个队列。发送消息时,将路由键设为 order,消息只会进入订单处理队列;设为 refund,则进入退款队列。
    • 日志分级:将路由键设为 error、info、warning。只有绑定 error 的队列(如告警服务)能收到错误日志,而绑定 info 的队列(如归档服务)能收到所有日志(如果绑定了多个键)。

# 3. Topic(主题交换机)

  • 功能:类似于 Direct,但支持通配符模糊匹配。
    • *:匹配一个单词。
    • #:匹配零个或多个单词。
  • 不同点:具备 Direct 的精确性,同时兼顾了 Fanout 的灵活性,能实现复杂的规则。
  • 使用场景:
    • 多维度分类:假设消息的路由键格式为 品类.地区.级别(如 电子产品.北京.紧急)。
      • 如果有一个队列只关心“北京的紧急订单”,可以绑定 *.北京.紧急。
      • 如果有一个队列关心“所有电子产品相关”,可以绑定 电子产品.#。
    • 微服务事件驱动:当不同服务需要监听同一类事件的不同子集时(如 user.created、user.updated、order.paid),Topic 能非常灵活地进行订阅。

# 4. Headers(头交换机)

  • 功能:忽略路由键,根据消息的 Headers 属性(键值对) 进行匹配。
  • 不同点:它不依赖路由键字符串,而是依赖消息头中的一组键值对,支持 any(任意一个匹配)和 all(全部匹配)两种匹配策略。
  • 使用场景:
    • 复杂路由逻辑:当路由条件无法用简单的字符串(如 direct)或带通配符的字符串(如 topic)表达时。
    • 元数据路由:例如,需要根据消息的“版本号”、“协议类型”、“加密方式”等多个动态属性来决定路由到哪个处理队列,而不是依靠固定的字符串。

# 总结对比

类型 匹配依据 特点 类比
Fanout 无 广播,忽略路由键 微信群发消息,群里所有人都能看到
Direct Routing Key 精确匹配字符串 快递单上的地址:门牌号必须精确匹配
Topic Routing Key 通配符匹配 模糊搜索或订阅:*.浙江.# 匹配浙江所有市县
Headers 消息属性 匹配键值对,支持 any/all 类似 HTTP 请求头路由,根据多个参数筛选

补充一点:在实际开发中,Topic 通常是使用频率最高的,因为它足够灵活;如果追求性能且路由规则简单,Direct 会更合适;如果完全不需要区分接收方,Fanout 最简洁;只有在路由逻辑非常复杂且依赖多个属性时,才考虑使用 Headers。