【RabbitMQ】RabbitMQ中死信交换机是什么?延迟队列呢?有哪些应用场景?

1.死信交换机(Dead Letter Exchange DLX)

1.1什么是死信交换机 ?

  • 死信: 在RabbitMQ中,无法被消费者正常处理的消息 称为死信(Dead Letter)。
  • 死信交换机: 用于接收死信 的交换机。当消息成为死信时,RabbitMQ会将其重新路由到死信交换机 ,再由死信交换机 根据绑定规则路由到死信队列。

1.2消息成为死信的条件

  • 1.消息被拒绝 :消费者调用basic.reject或basic.nack 并设置了requeue=false。
  • 2.消息过期 :消息在队列中的存活时间(TTL)到期。
  • 3.队列达到最大长度:队列已满,无法再接收新消息。

1.3死信交换机的配置

  • 在声明队列时,通过参数指定死信交换机和路由键:
java 复制代码
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx.exchange"); // 死信交换机
args.put("x-dead-letter-routing-key", "dlx.routingKey"); // 死信路由键
channel.queueDeclare("normal.queue", true, false, false, args);

1.4死信交换机的应用场景

  • 异常消息处理 :将处理失败的消息转移到死信交换机,便于后续分析或人工处理。
  • 延迟队列 :通过死信交换机+TTL实现延迟队列功能。

2.延迟队列

2.1什么是延迟队列?

  • 延迟队列:消息在发送到队列后,不会立即被消费,而是延迟一段时间后被消费者处理。
  • 实现方式:RabbitMQ本身不支持直接的延迟队列功能,但可以通过死信交换机+TTL实现。

2.2延迟队列的实现

1.设置消息TTL:

  • 在发送消息时设置消息的TTL(Time-To-Live)。
java 复制代码
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
    .expiration("10000") // TTL 为 10 秒
    .build();
channel.basicPublish("normal.exchange", "normal.routingKey", properties, body);

2.配置死信交换机:

  • 将消息发送到一个普通队列,并设置死信交换机和路由键。
java 复制代码
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx.exchange");
args.put("x-dead-letter-routing-key", "dlx.routingKey");
channel.queueDeclare("normal.queue", true, false, false, args);

3.创建死信队列:

  • 创建一个死信队列,绑定到死信交换机。
java 复制代码
channel.queueDeclare("dlx.queue", true, false, false, null);
channel.queueBind("dlx.queue", "dlx.exchange", "dlx.routingKey");

4.消费者处理延迟消息:

  • 消费者从死信队列中获取延迟消息并进行处理。
java 复制代码
channel.basicConsume("dlx.queue", true, (consumerTag, delivery) -> {
    // 处理延迟消息
}, consumerTag -> {});

2.3延迟队列的应用场景

  • 超时订单取消:用户下单后,如果30min内未支付,则自动取消订单。
  • 定时任务:在指定时间后执行任务,如发送提醒邮件。
  • 重试机制:消息处理失败后,延迟一段时间再重试。

3.示例:

3.1实现订单超时取消

1.发送订单消息:

java 复制代码
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
    .expiration("1800000") // TTL 为 30 分钟
    .build();
channel.basicPublish("order.exchange", "order.routingKey", properties, body);

2.配置死信交换机:

java 复制代码
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx.exchange");
args.put("x-dead-letter-routing-key", "dlx.routingKey");
channel.queueDeclare("order.queue", true, false, false, args);

3.创建死信队列:

java 复制代码
channel.queueDeclare("dlx.queue", true, false, false, null);
channel.queueBind("dlx.queue", "dlx.exchange", "dlx.routingKey");

4.消费者处理超时订单:

java 复制代码
channel.basicConsume("dlx.queue", true, (consumerTag, delivery) -> {
    // 处理超时订单
    String orderId = new String(delivery.getBody(), StandardCharsets.UTF_8);
    cancelOrder(orderId); // 取消订单
}, consumerTag -> {});

4.总结

  • 死信交换机 :用于处理无法被正常消费的消息 ,常用于异常消息的处理和延迟队列。
  • 延迟队列 :通过死信交换机+TTL 实现,适用于订单超时取消、定时任务、重试机制等场景。
  • 应用场景 :
    • 死信交换机 :异常消息处理、延迟队列。
    • 延迟队列 :订单超时取消、定时任务、重试机制。
相关推荐
灯澜忆梦13 小时前
【RabbitMQ #3】 | Go 客户端 + SpringAMQP
分布式·golang·rabbitmq
Q264336502319 小时前
【有源码】基于Spark的电商客户细分与盈利洞察分析系统-面向精准营销的电商客户细分模型构建与盈利能力可视化研究
大数据·hadoop·分布式·数据挖掘·数据分析·spark·毕业设计
晴空蓝天19 小时前
RabbitMQ 消息可靠投递:confirm 确认 + 消费重试 + 死信队列
rabbitmq
驭渊的小故事20 小时前
RabbitMQ 环境配置和 DirectRabbitConfig 的 SpringBoot 4.0.X 版本
spring boot·rabbitmq·java-rabbitmq
新思维软件20 小时前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
俊哥大数据21 小时前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
宸津-代码粉碎机1 天前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
程序猿乐锅1 天前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
ly76891 天前
RabbitMQ 消费确认与预取:manual ack、reject、nack 与 QoS 的取舍
rabbitmq·死信队列·消息可靠性·消费确认·qos 预取
灯澜忆梦1 天前
【RabbitMQ #7】 | 消息转换器
分布式·rabbitmq·ruby