消息队列RabbitMQ(五):死信队列与延迟队列
死信队列
引言
死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),其实应该叫做死信交换机才更恰当。
当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。

总结:其实死信队列就是一个普通的交换机,有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理的。但是你可以配置某个交换机为此队列的死信交换机,该队列的消息成为死信后会被重新发送到此 DLX 。至于怎么处理这个DLX中的死信就是看具体的业务场景了,DLX 中的信息可以被路由到新的队列。
消息成为死信的三种情况
- 队列长度到达限制,无法加入新的消息
- 消费者拒接消费消息,并且不重回队列。该信息会被清除并进入死信队列
- 原队列存在消息过期设置,消息到达超时时间未被消费
队列如何绑定 DLX
- x-dead-letter-exchange 指定此队列的死信队列
- x-dead-letter-exchange 指定此队列向DLX发送死信的routing key,因为这个时候该队列相当于一个生产者,发送消息要指定routing key
实现效果:往一个普通队列添加消息,消息过期成为死信,进入死信队列。死信队列根据配置好的route key 路由到与它绑定的其他普通队列。
声明死信队列(普通交换机)
// 声明死信交换机
@Bean("deadExchange")
public Exchange deadExchange(){
return ExchangeBuilder.topicExchange("sb_dead_exchange").durable(true)
.autoDelete().build();
}
声明普通队列,配置它的DLX
// 声明普通队列,绑定死信队列
@Bean
public Queue queue3(){
Queue build = QueueBuilder.durable("sb_dead_queue").build();
build.addArgument("x-message-ttl",10000);
build.addArgument("x-dead-letter-exchange","sb_dead_exchange");
// 此时队列相当于生产者,因此要指定消息的routing key,死信队列可以更加routing key路由到其他队列
build.addArgument("x-dead-letter-routing-key","user4.info");
return build;
}
// 绑定此队列和它的交换机
@Bean
public Binding exchangQueue3(@Qualifier("queue3")Queue queue,
@Qualifier("topicExchange") Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("user3.#").noargs();
}
绑定死信队列和普通队列,死信队列中的消息会根据路由发送到其他队列
// 绑定死信队列和普通队列
@Bean
public Binding exchangQueue4(@Qualifier("queue2")Queue queue,
@Qualifier("deadExchange") Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("user4.#").noargs();
}
延迟队列
延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。经典的应用场景是下单减库存。

预扣库存的模式下,我们下单会立刻减库存,但是超过支付时间还没支付的话该订单就会被取消,库存回滚。
具体实现可以采用定时器的方式,定时检查当前时间与下单时间是否超过上限,比如设置为30min。但是多久执行一次定时任务是个问题,精度大(比如1s执行一次)的话数据库的压力十分大,精度小(比如2min执行一次)的话又会带来误差。
现在采用的方式是采用延迟队列。RabbitMQ没有提供延迟队列的功能。但是我们能使用死信队列 + TTL 自己实现延迟队列。TTL时间为过期时间(如30min)。
我们为每条订单信息设置一个过期时间(30min),消息过期后成为死信,自动进入死信队列,死信队列又把消息路由到它绑定的普通队列,库存系统订阅该队列即可在30min后才取出该信息。间接实现了延迟队列的功能

如此设计库存系统就一定只能在30min后才能从队列中取出订单
消息队列RabbitMQ(五):死信队列与延迟队列的更多相关文章
- RabbitMQ 入门教程(PHP版) 延迟队列,延迟任务
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...
- 【RabbitMQ 实战指南】一 延迟队列
1.什么是延迟队列 延迟队列中存储延迟消息,延迟消息是指当消息被发送到队列中不会立即消费,而是等待一段时间后再消费该消息. 延迟队列很多应用场景,一个典型的应用场景是订单未支付超时取消,用户下单之后3 ...
- RabbitMQ 延迟队列,消息延迟推送
目录 应用场景 消息延迟推送的实现 测试结果 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给 ...
- C#实现rabbitmq 延迟队列功能
最近在研究rabbitmq,项目中有这样一个场景:在用户要支付订单的时候,如果超过30分钟未支付,会把订单关掉.当然我们可以做一个定时任务,每个一段时间来扫描未支付的订单,如果该订单超过支付时间就关闭 ...
- 如何用RabbitMQ实现延迟队列
前言 在 jdk 的 juc 工具包中,提供了一种延迟队列 DelayQueue.延迟队列用处非常广泛,比如我们最常见的场景就是在网购或者外卖平台中发起一个订单,如果不付款,一般 15 分钟后就会被关 ...
- RabbitMQ如何实现延迟队列?(转)
什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一 ...
- Java 延迟队列使用
延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到…… 应用场景比较多,比如延时1分钟发短 ...
- Dyno-queues 分布式延迟队列 之 基本功能
Dyno-queues 分布式延迟队列 之 基本功能 目录 Dyno-queues 分布式延迟队列 之 基本功能 0x00 摘要 0x01 Dyno-queues分布式延迟队列 1.1 设计目标 1. ...
- Dyno-queues 分布式延迟队列 之 生产消费
Dyno-queues 分布式延迟队列 之 生产消费 目录 Dyno-queues 分布式延迟队列 之 生产消费 0x00 摘要 0x01 前情回顾 1.1 设计目标 1.2 选型思路 0x02 产生 ...
- Dyno-queues 分布式延迟队列 之 辅助功能
Dyno-queues 分布式延迟队列 之 辅助功能 目录 Dyno-queues 分布式延迟队列 之 辅助功能 0x00 摘要 0x01 前文回顾 0x2 Ack机制 2.1 加入Un-ack集合 ...
随机推荐
- 【LiteOS】LiteOS消息队列
目录 前言 链接 参考 笔录草稿 基本概念 队列运作机制 队列运作原理 消息队列传输方式 消息队列的阻塞机制 出队阻塞 入队阻塞 任务相关函数 任务开发流程 注意事项 * 实战 前言 链接 LiteO ...
- python那些需要知道的事儿——内存泄漏
啥,内存也会泄露?漏了咋补?我的内存会不会越漏越小?咋一听到内存泄漏,本喵的脑子蹦出无数想法,所以到底啥是内存泄漏! 一.垃圾回收机制(GC)机制 在理解内存泄漏之前,需要补充一个知识,即GC机制(也 ...
- java例题_06 最大公约数&最小公倍数
1 /*6 [程序 6 求最大公约数及最小公倍数] 2 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数. 3 程序分析:利用辗除法. 4 */ 5 6 /*分析 7 * ======== ...
- 新动能 · 新机遇:SaaS软件提供商 Zoho 25 周年战略再升级
25年,在历史的长河中不过转眼一瞬:但是对于创造者来说,25年足以颠覆一个时代...... 作为世界级云应用服务商,Zoho已经走过了25年的砥砺岁月.从ManageEngine到Zoho云服务,从工 ...
- epoll poll select区别
函数依赖 ( Functional Dependency,FD) select:http://www.cnblogs.com/Anker/archive/2013/08/14/3258674.html ...
- Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
带下拉选项的输入框 (Textbox with Dropdown) 是既允许用户从下拉列表中选择输入又允许用户自由键入输入值.这算是比较常见的一种 UI 元素,可以为用户提供候选项节省操作时间,也可以 ...
- 网络编程Netty入门:责任链模式介绍
目录 责任链模式 责任链模式的简单实现 Netty中的ChannelPipeline责任链 服务端接收客户端连接 pipeline初始化 入站事件和出站事件 Pipeline中的Handler Pip ...
- 2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯
DevOpsDays 是一个全球知名的系列技术会议品牌,内容涵盖了软件开发.自动化.测试.安全.组织文化以及 IT 运营的社区会议等.DevOpsDays 由 DevOps 之父 Patrick De ...
- Day07_39_集合中的remove()方法 与 迭代器中的remove()方法
集合中的remove()方法 与 迭代器中的remove()方法 深入remove()方法 iterator 中的remove()方法 collection 中的remove(Object)方法 注意 ...
- Day09_46_Set集合_SortedSet03
SortedSet03 让SortedSet集合完成比较,还有另外一种方法,那就是单独编写一个比较器. java.util.comparator 在TreeSet集合创建的时候可以在集合中传入一个比较 ...