当前位置: 首页 > news >正文

RabbitMQ 中无法路由的消息会去到哪里?

1. 普通情况(默认行为)

如果消息发布时没有设置特殊参数:

// 默认情况:无法路由的消息直接被丢弃 channel.basicPublish( "my-exchange", // 交换机名称 "routing-key", // 路由键 null, // 消息属性(没有设置mandatory) messageBody // 消息体 );

结果:消息被静默丢弃,生产者不会收到任何通知。


2. 使用mandatory参数

当设置mandatory=true时:

channel.basicPublish( "my-exchange", "unroutable-key", { mandatory: true }, // 关键参数 messageBody ); // 添加返回监听器 channel.addReturnListener((returnMessage) => { console.log("消息无法路由被返回:", { replyCode: returnMessage.replyCode, replyText: returnMessage.replyText, exchange: returnMessage.exchange, routingKey: returnMessage.routingKey, body: returnMessage.body.toString() }); });

结果

  • 消息无法路由时,会通过Basic.Return命令返回给生产者
  • 生产者可以监听并处理这些返回的消息
  • 这是推荐的可靠消息发布方式

3. 使用备用交换器(Alternate Exchange,AE)

这是处理无法路由消息的最佳实践

// 1. 首先声明一个备用交换器(通常是一个Fanout类型) channel.assertExchange("my-ae", "fanout", { durable: true }); channel.assertQueue("unroutable-messages", { durable: true }); channel.bindQueue("unroutable-messages", "my-ae", ""); // 2. 声明主交换器时指定备用交换器 const args = { "alternate-exchange": "my-ae" }; channel.assertExchange("my-direct-exchange", "direct", { durable: true, arguments: args // 设置备用交换器 });

工作原理

发布消息 → 主交换器无法路由 → 自动转发到备用交换器 → 备用交换器路由到专用队列

优点

  • 无需生产者设置mandatory
  • 所有无法路由的消息都被集中收集
  • 可以后续分析、重试或人工处理

4. 与死信交换器(DLX)的区别

重要区分:无法路由的消息不会进入死信队列(DLQ),除非:

  1. 使用备用交换器将消息路由到队列
  2. 该队列配置了死信交换器
  3. 消息在该队列中过期或被拒绝
特性无法路由的消息死信消息
触发时机交换机找不到匹配队列消息在队列中被拒绝、TTL过期、队列超限
处理方式丢弃/返回/备用交换器转发到死信交换器
配置位置交换器级别队列级别

5. 实际工作流程示例

场景:订单系统

// 配置备用交换器收集无法路由的订单消息 channel.assertExchange("orders-ae", "fanout", { durable: true }); channel.assertQueue("dead-letters.orders", { durable: true }); channel.bindQueue("dead-letters.orders", "orders-ae", ""); // 主交换器 const args = { "alternate-exchange": "orders-ae" }; channel.assertExchange("orders", "direct", { durable: true, arguments: args }); // 正常队列 channel.assertQueue("orders.process", { durable: true }); channel.bindQueue("orders.process", "orders", "order.created"); // 生产者发布消息 // 如果路由键是 "order.updated"(没有队列绑定) // 消息会进入 dead-letters.orders 队列

6. 最佳实践建议

  1. 生产环境必选方案

    方案一(推荐): 启用备用交换器 + 监控无法路由消息队列 方案二: 设置 mandatory=true + 实现ReturnListener
  2. 监控和告警

    // 监控无法路由消息队列的长度 channel.assertQueue("unroutable-messages", { durable: true }); // 定期检查队列消息数 const result = channel.checkQueue("unroutable-messages"); if (result.messageCount > threshold) { sendAlert("发现大量无法路由的消息!"); }
  3. 常见原因分析

    • 路由键拼写错误
    • 消费者队列未正确绑定
    • 交换器类型与路由规则不匹配
    • 动态路由键生成逻辑错误

总结

RabbitMQ 中无法路由的消息有三条可能的路径:

  1. 默认:静默丢弃(不推荐)
  2. 通过mandatory=true:返回给生产者处理
  3. 通过备用交换器:集中收集到专门队列(最佳实践)

推荐架构

生产者 → 主交换器(配置备用交换器) ↓(无法路由) 备用交换器(Fanout) ↓ "unroutable.messages"队列 ↓ 监控系统/人工处理
http://www.jsqmd.com/news/529265/

相关文章:

  • AnolisOS双内核架构解析:RHCK与ANCK如何实现兼容与创新并存?
  • 2026年 黄金回收商家推荐排行榜:覆盖南京北京上海等30城,专业高价安全便捷的黄金变现服务商精选 - 品牌企业推荐师(官方)
  • 火爆全网的OpenClaw究竟有什么特殊魅力!一篇掌握各种玩法
  • SMT钢网激光切割避坑指南:从355nm紫外激光到纳米涂层的实战参数解析
  • 如何用Arduino PZEM-004T v3.0库构建智能电力监测系统?终极指南
  • 从光学原理到Halcon实现:缺陷检测算法背后的图像处理奥秘
  • NMN最新研究:2026哈佛辛克莱人体逆龄试验获批,奥本元NMN凭何领跑? - 资讯焦点
  • CentOS 8/9 服务器重启后宝塔面板打不开?一个Systemd服务文件搞定自启
  • 地形决定成败:为何精准的 DEM 是 2D 水动力模型的灵魂?
  • 2026年国内有哪些高端床垫品牌值得推荐:五家品牌对标测评 - 科技焦点
  • 面试官最爱的两道算法题,我帮你彻底搞懂了!
  • 国标参考文献自动化解决方案:GB/T 7714-2015 CSL样式深度应用指南
  • NAS玩家必备:用Node.js脚本批量整理Calibre-Web图书信息(附完整代码)
  • 文献阅读:FActBench: A Benchmark for Fine-grained Automatic Evaluation of LLM-Generated Text
  • IEEE TGRS | 中国矿业大学提出 O² 系列:首个面向遥感的实时旋转目标检测 Transformer
  • 深入解析C#中的MethodImpl同步特性:实例与静态方法的线程安全实践
  • 十大头部个人养老年金产品综合评测榜单 2026年个人养老年金选购指南 - 科讯播报
  • Elasticsearch 入门全景:核心概念与典型应用场景速览
  • RTL8812AU开源驱动全功能配置指南:从基础安装到高级渗透测试应用
  • APatch故障诊疗指南:从入门到精通的10个实战方案
  • 终极指南:BthPS3驱动让PS3手柄在Windows上完美蓝牙连接
  • 23种路径规划算法解决机器人导航核心难题
  • 3个被误解的暗黑2增强插件:重新认识PlugY的真正实力
  • 手性介质模拟:在COMSOL里玩转“扭曲“的电磁场
  • 2023年全国30米土地利用数据实战:从下载到ArcGIS可视化全流程指南
  • 盘点超景深工业显微镜十大品牌,购买要点全详解
  • Nociceptin (Orphanin FQ);FGGFTGARKSARKLANQ
  • 丹青识画与YOLOv8协同实战:画作中特定元素的检测与定位
  • AlienFX-Tools:硬件控制的开源革新方案
  • 4步实现Axure本地化:提升原型设计效率的界面汉化指南