简介
RabbitMQ 的延时队列(Delayed Queue)是指消息在发送到队列后,会在一定的时间内被延迟处理,直到预设的延迟时间结束,消息才会被消费者消费。RabbitMQ 本身并不原生支持延时队列,但我们可以通过一些插件或特定配置来实现这种功能。
延时队列的应用场景
- 定时任务:比如定时发送邮件、推送通知等操作。
- 重试机制:当某些任务失败时,可以让任务在一段时间后再次尝试。
- 延迟消费:在特定时间后消费消息,而不是立即消费。
死信队列(Dead Letter Queue,简称 DLQ)是消息队列中的一个特殊队列,用于存放那些因某些原因无法被正常消费的消息。死信队列在许多消息队列系统(如 RabbitMQ、Kafka 等)中都有应用。通过将无法消费的消息转移到死信队列中,可以帮助开发者发现和处理消息消费过程中的异常或错误。
死信队列的主要用途是:
- 错误处理:用于捕获无法消费的消息,避免这些消息丢失,并提供后续人工干预或自动重试的机会。
- 监控和诊断:通过查看死信队列,可以帮助开发者快速发现问题,例如队列被溢出、消息格式不正确等。
- 防止数据丢失:将那些因为超时、队列溢出、消费失败等原因无法处理的消息放入死信队列,可以保证它们不会丢失,后续可以进一步调查和处理。
本文结合延时队列和死信队列,延时队列的消息设置过期时间,在时间过期之后,将消息内容推送到死信队列中进行处理。
整合逻辑
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.27</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.7.7</version>
</dependency>
配置
server:
port: 8081
spring:
application:
name: walker-rabbitmq
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest_walker
password: guest
创建交换机|队列
延时队列
package com.walker.rabbitmq.delay.config;
import com.walker.rabbitmq.delay.constants.BaseConstant;
import com.walker.rabbitmq.delay.enums.RabbitMqConfigEnum;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class OrderDelayRabbitConfig {
// 交换机
@Bean
public DirectExchange orderDelayExchange(){
return new DirectExchange(RabbitMqConfigEnum.ORDER_DELAY.getExchange());
}
// 队列
@Bean
public Queue orderDelayQueue(){
Map<String,Object> args = new HashMap<>();
// 延时队列,需要绑定死信队列,在ttl到期之后,将队列转到死信队列
args