MQ 高级 - 01. 课程介绍

MQ 高级 - 02. 发送者可靠性 - 发送者重连


MQ 高级 - 03. 发送者可靠性 - 发送者确认机制




MQ 高级 - 04. 发送者可靠性 - 发送者确认的代码实现


MQ 高级 - 05.MQ 可靠性 - 数据持久化
MQ 高级 - 06.MQ 可靠性 - LazyQueue




MQ 高级 - 07. 消费者可靠性 - 消费者确认机制

MQ 高级 - 08. 消费者可靠性 - 消费者失败重试策略





MQ 高级 - 09. 消费者可靠性 - 业务幂等处理





MQ 高级 - 10. 延迟消息 - 什么是延迟消息

MQ 高级 - 11. 延迟消息 - 死信交换机

问题:解释下面代码?
这段代码的核心是:通过消息后置处理器给单条消息设置 TTL 过期时间,结合死信队列机制,让消息在指定时间后自动转发到死信队列,实现延迟消费,是死信队列实现延迟消息的核心生产者逻辑。(使用的是消息后置处理器)
问题:死信队列实现延迟消息
二、死信队列实现延迟消息的原理
核心思路:利用 "消息过期" 变成死信,转发到死信队列,实现延迟效果。
流程:
- 创建一个普通队列(不设置消费者),只用来让消息等待过期
- 给这个队列设置 TTL(过期时间)
- 给这个队列绑定 死信交换机 + 死信路由键
- 消息发送到这个队列 → 等待过期 → 变成死信
- 自动转发到 死信交换机 → 死信队列
- 消费者监听死信队列,消费时就实现了 "延迟执行"
一句话总结:让消息在一个没人消费的队列里等一会儿,过期后再进入真正的消费队列。
- 配置类:声明交换机、队列、绑定
java@Configuration public class DeadLetterConfig { // ======================= 1. 死信交换机、死信队列 ======================= @Bean public DirectExchange deadLetterExchange() { return new DirectExchange("dead.direct"); } @Bean public Queue deadLetterQueue() { return QueueBuilder.durable("dead.queue").build(); } @Bean public Binding deadLetterBinding() { return BindingBuilder.bind(deadLetterQueue()) .to(deadLetterExchange()) .with("dead"); } // ======================= 2. 延迟队列(TTL队列,无消费者) ======================= @Bean public Queue ttlQueue() { return QueueBuilder.durable("ttl.queue") // 消息过期时间:10秒 .ttl(10000) // 配置死信交换机 .deadLetterExchange("dead.direct") // 死信路由键 .deadLetterRoutingKey("dead") .build(); } @Bean public DirectExchange ttlExchange() { return new DirectExchange("ttl.direct"); } @Bean public Binding ttlBinding() { return BindingBuilder.bind(ttlQueue()) .to(ttlExchange()) .with("ttl"); } }四、消息生产者(发送延迟消息)
java@Service public class DelayProducer { @Autowired private RabbitTemplate rabbitTemplate; public void sendDelayMsg(String msg) { // 发送到 TTL 队列(没人消费,等待10秒过期) rabbitTemplate.convertAndSend( "ttl.direct", // TTL交换机 "ttl", // 路由键 msg // 消息内容 ); } }五、消费者(监听死信队列 → 延迟执行)
java@Component public class DeadLetterConsumer { // 监听死信队列 @RabbitListener(queues = "dead.queue") public void listen(String msg) { System.out.println("【延迟消费】收到消息:" + msg); System.out.println("延迟时间:10秒"); // 这里可以写业务:订单超时取消、关单、回滚库存... } }
MQ 高级 - 12. 延迟消息 - 延迟消息插件

问题:怎么将普通交换机改造为延迟交换机?
下图的两种方式,其实只要加上delayed即可(注解/bean方式)
注意:
延迟消息插件内部会维护一个本地数据库表,同时使用Elang Timers功能实现计时。如果消息的延迟时间设置较长,可能会导致堆积的延迟消息非常多,会带来较大的CPU开销,同时延迟消息的时间会存在误差。
因此,不建议设置延迟时间过长的延迟消息。

MQ 高级 - 13. 延迟消息 - 取消超时订单




