RabbitMQ 之 Exchange

摘要

  • 本文介绍 RabbitMQ 的 Exchange 的基本概念和用法。

  • Zookeeper官网

  • 本文使用的 RabbitMQ 版本为 4.1.4。

Exchange(交换机) 是什么?

  • 在 RabbitMQ 中,Exchange(交换机) 是消息路由的核心组件。它负责接收生产者发送的消息,并根据预定义的路由规则将消息转发到一个或多个队列。

  • Exchange 类型决定了消息的路由方式。RabbitMQ 支持的 Exchange 类型

Exchange 类型 声明类型 路由规则描述 典型用途
Direct direct 消息根据 路由键(routing key) 精确匹配绑定键(binding key)进行路由。 精确消息传递,如日志分类、任务分发等。
Fanout fanout 消息广播到所有绑定的队列,忽略路由键 广播消息,如发布/订阅模式、实时通知等。
Topic topic 消息根据路由键与绑定键模式的匹配进行路由,支持通配符 *(匹配一个词)和 #(匹配零个或多个词)。 模块化路由,如日志系统、事件驱动架构等。
Headers headers 消息根据 消息头部(headers) 与绑定时指定的头部匹配进行路由,支持 x-match 参数(anyall)。 多条件路由,如复杂过滤、动态路由等。
Local Random Exchange x-local-random 消息始终被路由到本地队列,如果有多个本地队列绑定,则随机选择一个进行投递。 请求-响应(RPC)模式,低延迟通信
  • RabbitMQ 默认为我们提供了如下的交换机

  • 每新创建一个 Vhost,RabbitMQ 就会自动创建以下交换机,比如 /vtest

  • 当然我们也可以根据需要创建新的交换机

  • 配置说明

    • Durability: 指定 Exchange 是否持久化。
      • Durable: 持久化的 Exchange 会被保存在磁盘上,重启 RabbitMQ 时会自动恢复。
      • Transient: 非持久化的 Exchange 会被保存在内存中,重启 RabbitMQ 时会丢失。
    • Auto-delete: 指定 Exchange 是否自动删除。
      • yes: 如果没有队列或交换机绑定该 Exchange,则该 Exchange 会自动删除。
      • no: 该 Exchange 不会自动删除。
    • Internal: 用于控制交换机是否可以被生产者直接发布消息
      • yes: 不能被生产者直接发送消息,该交换机只能用于 将消息从其他交换机转发到该交换机。
      • no: 可以被生产者直接发送消息。
    • Arguments: 用于设置 Exchange 的其他参数,目前仅支持一个参数
      • Alternate exchange(alternate-exchange): 指定该 Exchange 的备用交换机,如果无法以其他方式将发往此交换机的消息路由出去,则将它们发送至此处指定的备用交换机。

Direct Exchange(直接交换机)

  • 路由规则:消息的路由键与队列的绑定键完全匹配时,消息被路由到该队列。

  • 示例:如果队列绑定键为 error,则只有路由键为 error 的消息会被路由到该队列。

  • 适用场景:需要精确匹配的场景,如日志分类、任务分发等。

Fanout Exchange(扇出交换机)

  • 路由规则:消息广播到所有绑定的队列,忽略路由键。

  • 示例:无论消息的路由键是什么,都会被路由到所有绑定的队列。

  • 适用场景:广播消息,如发布/订阅模式、实时通知等。

Topic Exchange(主题交换机)

  • 路由规则:消息的路由键与队列的绑定键模式匹配时,消息被路由到该队列。支持通配符 *(匹配一个词)和 #(匹配零个或多个词)。

  • 示例:如果队列绑定键为 .orange.,则路由键为 quick.orange.rabbit 的消息会被路由到该队列。

  • 适用场景:模块化路由,如日志系统、事件驱动架构等。

Headers Exchange(头部交换机)

  • 路由规则:消息的头部与队列的绑定头部匹配时,消息被路由到该队列。支持 x-match 参数(any 或 all)。即使配置了路由键也会忽略。

  • 示例:如果队列绑定头部为 { “x-match”: “all”, “format”: “pdf”, “priority”: “high” },则只有同时满足这两个条件的消息会被路由到该队列。

  • 适用场景:多条件路由,如复杂过滤、动态路由等。

Local Random Exchange(本地随机交换机)

  • Local Random Exchange 是 RabbitMQ 4.0 引入的交换机类型,旨在优化请求-响应模式下的消息路由,特别适用于低延迟和高吞吐量的场景。通过结合独占队列使用,可以确保消息快速传递到本地消费者,减少网络延迟,提高系统性能。

  • 路由规则:消息始终被路由到本地队列(位于同一节点上),如果有多个本地队列绑定,则随机选择一个进行投递。

  • 示例:假设节点 A 上有两个绑定了 x-local-random 交换机的队列 Q1 和 Q2,发布的消息会随机路由到 Q1 或 Q2,但不会路由到其他节点的队列。

  • 适用场景:请求-响应(RPC)模式下的低延迟通信,适合微服务架构中每个节点上都有消费者的场景。

  • 在使用 Local Random Exchange 时,必须满足以下条件:

    • 独占队列:消费者应声明独占队列,以确保队列仅绑定到当前节点。
    • 每个节点至少一个消费者:每个 RabbitMQ 节点上应至少有一个消费者,否则在该节点上发布的消息将被丢弃。
    • 交换机类型声明:使用 x-local-random 类型声明交换机。

Exchange 与 Queue 绑定(Binding)

  • 创建好 Exchange 之后,需要将 Exchange 与 Queue 绑定,才能将消息发送到指定的队列。

  • Exchange 与 Queue 的绑定关系,即 Exchange 发送的消息,会根据路由键与队列的绑定键进行匹配,如果匹配成功,则将消息发送到对应的队列。

  • 在 Exchange 页面点击 Exchange 的名称,进入 Exchange 详情页面,此处可以进行 Exchange 与 Queue 绑定配置

    这里的Arguments用于设置 绑定 的其他参数,比如 Headers Exchange 需要设置 x-match 参数等。