news 2026/8/6 0:57:13

【面试题】RabbitMQ 中无法路由的消息会去到哪里?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【面试题】RabbitMQ 中无法路由的消息会去到哪里?

在 RabbitMQ 中,无法路由的消息(即交换机无法将消息路由到任何队列)的处理方式取决于消息发布时的参数配置,主要有以下几种情况:

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

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

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

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


2. 使用mandatory参数

当设置mandatory=true时:

/* by yours.tools - online tools website : yours.tools/zh/blood.html */ 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"队列 ↓ 监控系统/人工处理

这样既能保证消息不丢失,又能及时发现路由配置问题。

❤️ 如果你喜欢这篇文章,请点赞支持! 👍 同时欢迎关注我的博客,获取更多精彩内容!

本文来自博客园,作者:佛祖让我来巡山,转载请注明原文链接:https://www.cnblogs.com/sun-10387834/p/19388747

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 22:35:38

游戏开发必备!车辆启动音效支持多角度录制

当你听到的不是一个孤立的汽车轰鸣,而是随着视角与油门变化、层次分明的声浪组合时,虚拟驾驶的沉浸感才真正建立起来。你是否正在开发一款赛车游戏、模拟驾驶应用,或者为开放世界游戏打造交通系统,却苦于找不到高品质、有深度的车…

作者头像 李华
网站建设 2026/7/29 5:17:40

云南名族医药深度玩法旅游景点酒店交通住宿系统 小程序功能多

目录云南民族医药深度旅游小程序功能摘要项目技术支持论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作云南民族医药深度旅游小程序功能摘要 民族医药文化体验 小程序整合云南白族、傣…

作者头像 李华
网站建设 2026/8/5 13:33:23

宠物健康服务宠物用品商城系统APP的设计与实现 小程序

目录摘要项目技术支持论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作摘要 随着宠物经济的快速发展,宠物健康服务及用品需求日益增长,传统线下购物模式已无法满…

作者头像 李华
网站建设 2026/7/30 5:54:20

以太坊2025:机构拥抱与“象牙塔”的瓦解

概括 2025年,全球金融机构纷纷涌向以太坊,各大银行和科技公司选择其二层生态系统进行资产代币化和链上服务。 监管清晰度释放了华尔街的需求,使以太坊成为传统金融的默认网络。 以太坊基金会也摆脱了其“象牙塔”形象,加强了企业外…

作者头像 李华
网站建设 2026/7/30 1:46:49

GetQzonehistory:3步永久保存QQ空间珍贵回忆

GetQzonehistory:3步永久保存QQ空间珍贵回忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经翻看QQ空间时发现,那些记录青春岁月的说说竟然无法完整显…

作者头像 李华
网站建设 2026/7/31 9:03:49

数据库SQL优化建议:VibeThinker分析慢查询并重写

数据库SQL优化新范式:用轻量级AI模型实现智能重写 在现代高并发系统中,一条低效的SQL可能让整个服务陷入瘫痪。某电商平台曾因一个未加索引的WHERE age > 30查询导致数据库CPU飙升至95%,订单延迟超过10分钟——而这本可以通过自动化工具提…

作者头像 李华