使用消息队列(MQ)实现“订单30分钟未支付自动关闭”是分布式系统中非常经典的延迟队列(Delay Queue)应用场景。 相比于使用定时任务(如 每分钟轮询数据库),使用 MQ 的优势在于:实时性高、对数据库压力小、易于横向扩展。 以下是几种主流 MQ 的实现方案及核心逻辑: --- 核心业务流程 无论使用哪种 MQ,业务逻辑大体一致: 1. 用户下单:创建订单,状态为“待支付”,扣减库存。 2. 发送延迟消息:向 MQ 发送一条包含“订单号”的消息,设置延迟时间为 30 分钟。 3. 消费消息:30 分钟后,消费者收到该消息。 4. 检查状态(关键):消费者查询数据库中该订单的状态。 若已支付/已取消:丢弃消息,不做处理。 若仍为“待支付”:执行关单逻辑(修改状态为“已关闭”、回滚库存)。 --- 方案一:RabbitMQ (TTL + 死信队列 DLX) 这是 RabbitMQ 原生不支持延迟队列时的经典做法。利用 TTL (Time To Live) 和 DLX (Dead Letter Exchange) 特性。 原理 1. 创建死信交换机 (DLX) 和 死信队列 (...