# 死信队列简介
死信队列又称之为延迟队列、延时队列,也是 RabbitMQ 队列中的一种,指进入该队列中的消息会被延迟消费的队列。
这种队列跟普通的队列相比,最大的差异在于消息一旦进入普通队列将会被立即被消费处理,而延迟队列则是会过一定的时间再进行消费。
在传统企业级应用系统中,实现消息、业务数据的延迟处理一般是通过开启定时器的方式,轮询扫描并获取数据库表中满足条件的业务数据记录,然后比较数据记录的业务时间和当前时间。如果当前时间大于记录中的业务时间,则说明该数据记录已经超过了指定的时间而未被处理,此时需要执行相应的业务逻辑,比如失效该数据记录、发送通知信息给指定的用户等。对于这种处理方式,定时器是每隔一定的时间频率不间断的去扫描数据库表,并不断地获取满足业务条件的数据,知道手动关闭该定时器(如果不关闭的话,定时器开启的线程将会一直运行下去)。
死信队列/延迟队列指的是可以延迟一定得时间再处理相应的业务逻辑,而这也可以看作是死信队列的作用,即死信队列/延迟队列可以实现特定的消息或业务数据等待一定的时间 TTL 后,再被消费者监听消费处理。
# 典型应用场景
- 成功抢到票后 30 分钟内为付款的处理流程
- App 点外卖时下单去付款而迟迟没有在规定的时间内完成
- 用户提交会员注册信息后 30 分钟内没有进行邮箱或短信验证时发送提醒
- 。。。。
当用户在商城平台看到满意的商品时,单击“加入购物车”按钮,即可将商品加入自己的购物车内。选购完毕,单击去付款按钮后,将会跳转到支付页面,此时系统会为用户生成一笔对应购物车中商品的订单,并将该订单的状态设置为 0,即代表“未付款”,同时将该订单的 id 或者订单标号塞入 RabbitMQ 的延迟队列中,并设置延迟时间为 30 分钟。
如果用户在 30 分钟内选择了某种付款方式并进行了付款,则系统将更新该订单 id 对应的订单支付状态为 1,即已付款,同时更新订单中所包含的商品对应的库存;如果用户在 30 分钟内迟迟未付款,则 RabbitMQ 的延迟队列对应的消费者将会在 30 分钟后监听到该订单的 id,根据该订单的 id 查询数据库的订单数据表,如果该订单的付款状态仍然为 0(即未付款),则表示用户已经超过 30 分钟而仍然未付款,此时需要使该订单失效,同时更新回退商品库存。
可以看出,RabbitMQ 死信队列的引入主要是用于“延迟”一定得时间再处理特定的业务逻辑,而这种“延迟”在 RabbitMQ 看来是“自动化”的,无须认为进行干预,即只需要指定延迟队列中交换机所绑定的处理业务逻辑的“真正队列“,并开发这个”真正队列“对应的消费者的监听消费功能即可。