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

死信队列vs延迟队列

前言

大家好,今天我们来聊聊消息队列中两个很实用但经常被忽视的特性——死信队列和延迟队列。无论是在实际开发中,还是在技术面试中,理解这两个概念都能让你脱颖而出。

什么是死信队列?

简单来说,死信队列就是用来存放那些“处理不了”的消息的特殊队列。

死信消息是怎么产生的?

  • 多次处理失败:一条消息被消费了多次还是失败,总不能一直让它占着茅坑不拉屎吧?
  • 消息过期:消息在队列里待的时间太长了,超过了设置的存活时间
  • 明确拒绝:消费者直接说“这消息我处理不了,拿走拿走”

死信队列用在哪?

错误处理场景
想象一下,电商系统中的订单支付消息,如果因为第三方支付接口故障导致处理失败,重试几次后还是不行,就可以放到死信队列,后续人工介入处理。

监控报警
通过监控死信队列的消息数量,可以及时发现系统异常。比如死信队列突然暴涨,说明系统肯定出问题了!

消息审计
分析死信消息,找到系统中的bug或者设计缺陷。

代码实现示例

以RabbitMQ为例:

// 配置死信交换器
@Bean
public DirectExchange dlxExchange() {return new DirectExchange("dlx.exchange");
}@Bean
public Queue dlxQueue() {return new Queue("dlx.queue", true);
}@Bean
public Binding dlxBinding() {return BindingBuilder.bind(dlxQueue()).to(dlxExchange()).with("dlx.routingkey");
}// 主要队列配置死信
@Bean
public Queue businessQueue() {Map<String, Object> args = new HashMap<>();args.put("x-dead-letter-exchange", "dlx.exchange");args.put("x-dead-letter-routing-key", "dlx.routingkey");args.put("x-message-ttl", 10000); // 10秒过期return new Queue("business.queue", true, false, false, args);
}

什么是延迟队列?

延迟队列就像是消息的“等候室”——消息发进去后,不会立即被消费,而是等设定的时间到了才会被投递出去。

延迟队列的典型使用场景

定时任务

  • 电商订单:30分钟未支付,自动取消订单
  • 定时提醒:会议开始前15分钟发送通知

智能重试
消息处理失败后,不立即重试,而是等一会再试,避免给故障系统雪上加霜。

经典案例
主从数据库同步延迟问题。比如发出一条消息后,消费者立即去从库查询,可能因为主从延迟查不到数据。这时候让消息延迟100ms再消费,问题就巧妙解决了!

实现方式

RabbitMQ实现延迟队列

// 使用插件实现延迟消息
@Bean
public CustomExchange delayExchange() {Map<String, Object> args = new HashMap<>();args.put("x-delayed-type", "direct");return new CustomExchange("delay.exchange", "x-delayed-message", true, false, args);
}// 发送延迟消息
public void sendDelayMessage(String message, int delayTime) {rabbitTemplate.convertAndSend("delay.exchange", "delay.routingkey", message, msg -> {msg.getMessageProperties().setDelay(delayTime);return msg;});
}

RocketMQ实现延迟队列

// RocketMQ原生支持延迟消息
Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes(RemotingHelper.DEFAULT_CHARSET));
// 设置延迟级别:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
msg.setDelayTimeLevel(3); // 10秒后消费
SendResult sendResult = producer.send(msg);

实战对比

特性

死信队列

延迟队列

目的

处理失败消息

定时投递消息

触发条件

处理失败、过期、拒绝

时间到达

典型场景

错误处理、监控

定时任务、延迟重试

消息状态

被动进入(处理失败)

主动进入(设定延迟)

总结

死信队列和延迟队列就像是消息队列系统中的“特种部队”,在特定的场景下发挥着不可替代的作用:

  • 死信队列是你的安全网,确保问题消息不会影响正常业务流程
  • 延迟队列是你的定时器,让消息在正确的时间做正确的事

掌握了这两个概念,无论是实际开发中处理复杂业务场景,还是在技术面试中展示你的技术深度,都会让你游刃有余。


技术点点睛

  • 死信队列:无法被正常处理、多次失败、异常隔离
  • 延迟队列:指定时间消费、定时任务、智能重试

http://www.dtcms.com/a/465966.html

相关文章:

  • 给实体店老板做的网站怎么网站排名seo
  • 商务网站建设毕业设计成都网站建设公司排行
  • 基于体素密度的几何重要性剔除(Voxel Density Culling)
  • 卷积神经网络详解
  • Redission
  • 前端框架深度解析:Vue 从入门到实战,掌握渐进式开发核心
  • 从暴力到滑动窗口全解析——力扣8. 字符串转换整数 (atoi)
  • 迅为RK3562开发板Android 系统动态替换开机logo的实现-替换logo
  • 基于Springboot + vue3实现的校园闲置物品交易平台
  • 学校网站 制作wordpress图片时间
  • MySQL分区分表实现方法详解
  • 缠论工具czsc快速使用入门(二)
  • Android 14 Input 事件派发机制深度剖析
  • 苏州做网站外包的公司有哪些许昌做网站团队
  • android 屏幕适配
  • ESP32开发:从Wi-Fi连接到MQTT通信
  • Linux工作队列workqueue的实现
  • 模板建站和开发网站区别wordpress 页面瀑布流
  • [C# starter-kit] 身份验证与授权 Identity JWT
  • C#通讯关键类的API
  • 网站开发说明书天元建设集团有限公司申请破产了吗
  • 分布式单例模式在微服务架构中的关键作用与实践
  • 网站footer模板建设银行甘肃省行网站
  • 网站建设和电商区别wordpress创建角色
  • 网站开发软件公司网站建设运营公司
  • Java开发环境搭建及基础练习
  • 【三维重建】即插即用的3DGS的PDE优化:高质量渲染和重建
  • TDS:连接器漫谈之可信空间中的沉默契约与隐秘通道
  • AI Compass前沿速览:DeepSeek-V3.2、Sora 2、Imagine v0.9、LONGLIVE–英伟达、xLLM、OpenAgents
  • 为什么要建设图书馆网站网站建设情况的报告