springCloud_day07(MQ高级)

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 过期时间,结合死信队列机制,让消息在指定时间后自动转发到死信队列,实现延迟消费,是死信队列实现延迟消息的核心生产者逻辑。(使用的是消息后置处理器)

问题:死信队列实现延迟消息

二、死信队列实现延迟消息的原理

核心思路:利用 "消息过期" 变成死信,转发到死信队列,实现延迟效果。

流程:

  1. 创建一个普通队列(不设置消费者),只用来让消息等待过期
  2. 给这个队列设置 TTL(过期时间)
  3. 给这个队列绑定 死信交换机 + 死信路由键
  4. 消息发送到这个队列 → 等待过期 → 变成死信
  5. 自动转发到 死信交换机 → 死信队列
  6. 消费者监听死信队列,消费时就实现了 "延迟执行"

一句话总结:让消息在一个没人消费的队列里等一会儿,过期后再进入真正的消费队列。

  1. 配置类:声明交换机、队列、绑定
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. 延迟消息 - 取消超时订单

末尾页

相关推荐
guodingdingh5 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯7 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育7 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵7 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔9 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影9 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao1213110 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔10 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城11 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience12 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu