RabbitMQ 在 Ubuntu 的消息路由规则
核心概念与适用说明
- 路由发生在Exchange(交换机)上,依据消息的RoutingKey与队列和交换机之间的BindingKey进行匹配,最终投递到一个或多个Queue(队列)。
- 在 Ubuntu 上的路由规则与操作系统无关,由 RabbitMQ 的交换机类型与绑定关系决定。RabbitMQ 提供 direct、fanout、topic、headers 四种常用交换机类型,外加一个特殊的 默认直连交换机(空字符串 “”)。
路由规则一览
- Direct Exchange(直连交换机)
- 匹配规则:当消息的 RoutingKey 与绑定的 BindingKey 完全相同时投递到对应队列;支持一个 BindingKey 绑定到多个队列(一对多)。
- 典型场景:精确路由、一对一或按类别精确分发(如按日志级别 error、warn)。
- Fanout Exchange(扇出交换机)
- 匹配规则:忽略 RoutingKey,将消息广播到所有与之绑定的队列。
- 典型场景:日志广播、事件通知到多个子系统。
- Topic Exchange(主题交换机)
- 匹配规则:RoutingKey 与 BindingKey 按“.”分词进行模式匹配;通配符:“*” 匹配 1 个单词,“#” 匹配 0 个或多个单词。
- 典型场景:按主题/租户/业务维度灵活分发(如 com.rabbitmq.、.hidden.#)。
- Headers Exchange(头交换机)
- 匹配规则:不依赖 RoutingKey,依据消息 headers 的键值对进行匹配;可设置匹配策略(如全部匹配/任意匹配)。
- 典型场景:基于用户身份、权限、租户标签等复杂条件路由;性能相对较差,使用频率较低。
- Default Exchange(默认直连交换机)
- 特性:名称为空字符串 ""的直连交换机;每个新建队列会自动以队列名作为 BindingKey绑定到它。
- 便捷用法:向默认交换机发送消息时,只要 RoutingKey = 队列名,即可直达该队列。
常见路由示例
- Topic 示例
- 绑定键:Q1 绑定 “.TT.”,Q2 绑定 “TT.#”。
- 路由键为 “A.TT.B” 的消息匹配到 Q1;路由键为 “TT.AA.BB” 的消息匹配到 Q2。
- Direct 示例
- 队列 Q 以 BindingKey = “order.created” 绑定到直连交换机;仅当消息 RoutingKey = “order.created” 时才会进入 Q。
无匹配时的处理与常用发布参数
- 当消息无法匹配任何队列时,默认会被丢弃;若希望感知或处理此类情况,可在发布时开启 mandatory=true,此时消息无法路由将返回给生产者(可通过 ReturnListener 处理)。
- 另一个与投递时机相关的参数是 immediate(已标记为过时):要求消息到达的队列立即有消费者才投递,否则返回给生产者;现代应用通常使用消费者确认与**死信队列(DLX)**等机制替代其语义。