RabbitMq死信队列/延迟队列

什么是死信队列

死信队列又被称为延迟队列、延时队列,也是RabbitMq队列中的一种,指的是进入该队列中的消息会被延迟消费的队列。它与普通队列最大的 区别就是会过一定的时间在进行消费。

我们来模拟一个场景,比如12306抢票,当用户抢到火车票时,12306官方会提示用户“请在30分钟内付款”,由于种种原因,用户迟迟没有付款,过了30分钟后仍然没有支付,系统自动取消该笔订单。

对于这种业务,在我们的实际生活中是非常常见的,在以前传统的处理方式可以是采用一个定时器,定时去获取没有付款的订单,并判断用户的下单时间距离当前的时间是否已经超过30分钟,如果是,表示用户在30分钟内内有付款,系统将自动失效该笔订单并回收该车票。但是这种方式存在非常大的隐患,我们知道,春运抢票是一个大数据量、高并发请求的场景,再用户抢到票到支付这段时间内,如果定时器频繁的从数据库中获取“未付款”状态的订单,其数据量之大难以想象,并且大批用户在30分钟内迟迟不付款,从数据库中获取的数据量将一直在增长,当到达一定程度时,将给数据库服务器和应用服务器带来巨大的压力。

而消息中间件rabbitmq的引入,将大大改善上面的情况,其流程如下图:
RabbitMq死信队列/延迟队列
死信队列代替了原来定时器的逻辑,私信队列/延迟队列可以实现特定的消息或业务数据等待一定的时间TTL后,再被消费者监听消费处理。

优势

1、占用系统资源少
不需要在伦旭数据库获取数据,减少DB层面资源的消耗
2、人为干预少
只需要搭建好死信队列的消息模型就可以不需要在去干预了
3、自动消费处理
当制定的延迟时间一到,消息就自动被路由到实际的队列进行处理

结构介绍

与普通的队列相比,死信队列同样具有消息、交换机、路由和队列等转悠级名次,只不过在死信队列里增加了另外三个成员:
DLX(Dead Letter Exchange):死信交换机,就是交换机的一种类型,知识属于特殊的类型。
DLK(Dead Letter Routing-key):死信路由,同样也是一种特殊的路由,主要是跟DLX组合在一起组成死信队列。
TTL(Time To Live):指进入死信队列中的消息可以存活的时间。

其中DLX跟DLK是必须的成员,而TTL则是可选、非必须的。

RabbitMq死信队列/延迟队列
RabbitMq死信队列/延迟队列
流程:
消息到达第一个中转站,即死信队列,由基本交换机和基本路由绑定,并对应到指定的死信队列,因而消息将进入第一个暂存区,即死信队列中,而死信队列不同于一般的普通队列,它由三大部分组成,当消息进入死信队列时,TTL便开始进入倒计时,当存活时间一到,消息将进入第二个中转站,即真正的消息模型中的死信交换机。由于死信交换机和死信路由绑定,并对应到指定的真正的 队列,因而此时消息将不做停留,而是直接被路由到第二个暂存 区,即真正的队列中,最终该消息被真正的队列对应的消费者监听。至此,消息才完成满城的旅行。

死信结构的出现

1、消息被拒绝并且不再重新投递,即requeue参数的取值为false
2、消息超过了指定的存活时间
3、队列达到最大长度了

实例

未完待续。。。