rabbitMQ的延迟队列(死信交换机)

RabbitMQ 的延迟队列是一种机制,允许消息在发送到队列后,延迟一定时间才被消费者接收到并处理。这在需要定时任务、延迟处理等场景下非常有用。

RabbitMQ 实现延迟队列的方式

RabbitMQ 本身并没有直接支持延迟队列的功能,但可以通过 死信交换机(DLX) 和 TTL(Time To Live,消息生存时间) 机制结合来实现延迟队列。其主要原理是将消息先发送到一个带有 TTL 的队列,当消息到达 TTL 后变为"死信",然后通过死信交换机将消息转发到实际处理队列,从而实现消息的延迟投递。

实现原理

  1. TTL(Time To Live) :TTL 是 RabbitMQ 提供的一种消息生存时间控制机制。可以为队列或消息设置 TTL,消息在 TTL 到期后会变成"死信"。
    • TTL 可以在消息级别和队列级别进行设置。消息级别的 TTL 是针对单条消息的,队列级别的 TTL 是针对队列中的所有消息的。
  2. DLX(Dead Letter Exchange)死信交换机:当消息在队列中变为死信时,可以指定一个死信交换机将该消息路由到指定的死信队列。在延迟队列中,消息在 TTL 到期后就会进入死信队列,而该死信队列就是我们实际的消费队列,从而实现延迟消费。

延迟队列实现流程

  1. 创建一个 延迟队列,为其指定消息的 TTL(即消息延迟的时间)。
  2. 为该延迟队列绑定一个 死信交换机(DLX),当消息在延迟队列中过期时,自动转发到死信交换机,再通过死信交换机转发到实际消费队列。
  3. 消息到达实际消费队列后,消费者才会收到并处理消息。

实现步骤

1. 创建延迟队列

延迟队列配置了 TTL 和 DLX(死信交换机),消息在 TTL 时间到期后将被转发到 DLX。

java 复制代码
// 定义延迟队列
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "delayed-exchange");  // 指定死信交换机
args.put("x-message-ttl", 10000);  // 消息过期时间(毫秒),即延迟时间

channel.queueDeclare("delayed-queue", true, false, false, args);
2. 创建死信交换机及实际消费队列

定义死信交换机和消费队列,当延迟队列中的消息过期后,消息会通过 DLX 转发到该消费队列。

java 复制代码
// 定义死信交换机
channel.exchangeDeclare("delayed-exchange", "direct");

// 定义实际消费队列
channel.queueDeclare("real-consumer-queue", true, false, false, null);

// 将实际消费队列绑定到死信交换机
channel.queueBind("real-consumer-queue", "delayed-exchange", "delayed-key");
3. 发送消息到延迟队列

发送消息到延迟队列时,可以设置消息的 TTL 或者使用默认的 TTL。

java 复制代码
// 发送消息到延迟队列
String message = "This is a delayed message";
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
    .expiration("10000")  // 单条消息的 TTL,单位为毫秒
    .build();

channel.basicPublish("", "delayed-queue", properties, message.getBytes());
4. 消费消息

消费者只从实际的消费队列中消费消息。

java 复制代码
// 消费消息
channel.basicConsume("real-consumer-queue", true, (consumerTag, message) -> {
    String msg = new String(message.getBody(), "UTF-8");
    System.out.println("Received message: " + msg);
}, consumerTag -> {});

延迟队列的应用场景

  1. 订单超时取消:当用户提交订单后,可能需要设定一个定时任务来检查订单是否支付成功,如果超时未支付则自动取消订单。
  2. 定时任务:某些任务不需要立即执行,使用延迟队列可以在特定时间后再执行。
  3. 短信或邮件发送:某些通知或提醒需要在特定时间点发送,而不是立即发送。

总结

RabbitMQ 的延迟队列通过 TTL 和 DLX 的结合使用,可以实现消息的延迟投递。这种机制允许消息在设定的延迟时间后再进行消费,适用于各种需要延时处理的场景。

相关推荐
新思维软件22 分钟前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
俊哥大数据27 分钟前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
宸津-代码粉碎机7 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
程序猿乐锅8 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
ly76899 小时前
RabbitMQ 消费确认与预取:manual ack、reject、nack 与 QoS 的取舍
rabbitmq·死信队列·消息可靠性·消费确认·qos 预取
灯澜忆梦10 小时前
【RabbitMQ #7】 | 消息转换器
分布式·rabbitmq·ruby
需要82610 小时前
分布式事务:Seata AT/TCC/SAGA 的取舍与踩坑
java·spring boot·分布式·spring·spring cloud
CS创新实验室13 小时前
为什么三台机器就能选出一个“带头大哥“?——Raft 一致性算法,一次讲透
分布式·操作系统
本人手速666+14 小时前
企微开发API如何设计客户冻结状态?WeComApi 在删除、投诉和异常客户场景中的自动化边界
运维·分布式·自动化·企业微信·企微外部群开发·wecomapi·企业微信二次开发
灯澜忆梦16 小时前
【RabbitMQ #4】 | Work 任务模型
分布式·rabbitmq