延迟队列
2025-4-20
| 2025-4-20
Words 1204Read Time 4 min
type
status
date
slug
summary
tags
category
icon
password
延迟队列的意思是一条消息,在经过一定时间之后才会被处理,比如支付宝抢票,抢到票之后10分钟之内才能下单,10分钟之后就作废了,类似于定时。

架构

生产者发送消息经过交换机发送到两个延迟队列,一个是 10 秒,一个是 40 秒,经过该时间之后过期,发送到死信队列,c 消费者进行处理。
notion image

创建流程

创建 X,Y交换机,QA,QB,QD 队列,QA,QB 绑定死信交换机,X 交换机和 QA,QB 绑定,Y 交换机和 QD 绑定。

代码

发送消息

消费者消费消息

结果

可以看到接收消费的时间间隔
notion image
image-20230619180103647

延迟队列优化

之前是每个队列指定一个过期时间,但如果要增加新的时间需求,就需要创建新的队列。所以,现在是使用一个队列就可以了,延迟多长时间由消费者来确定。
notion image
image-20230619154659948
这样消费者是可以指定过期时间的,但是也会遇到一个问题,因为它是队列,是先进先出的,所以即使第一条消息设置的时间比第二条长,第一条消息不被消费,第二条消息也不会被消费。

代码

结果

可以看到,先消费时间长的,再消费时间短的。
notion image
image-20230619182234397

基于插件的延迟队列

基于插件的延迟队列,是安装一个插件,延迟时间交给交换机来处理了,交换机先存储消息,等到达一定的时间之后再把消息发送给队列。这样流程就简单多了,就不需要死信来处理了,普通消费者即可。
notion image
image-20230619163111292
代码未实现。
总结
延时队列在需要延时处理的场景下非常有用,使用 RabbitMQ 来实现延时队列可以很好的利用
RabbitMQ 的特性,如:消息可靠发送、消息可靠投递、死信队列来保障消息至少被消费一次以及未被正
确处理的消息不会被丢弃。另外,通过 RabbitMQ 集群的特性,可以很好的解决单点故障问题,不会因为
单个节点挂掉导致延时队列不可用或者消息丢失。
引出动态代理并行流
Loading...