很多订单系统都有“超时未支付自动关闭”的需求。
我们以前用定时任务扫库,延迟大、性能差,后来改为 RabbitMQ 的延迟队列实现,系统彻底稳定。
一、需求背景
系统需求:
- 用户下单后 30 分钟未支付 → 自动关闭
- 高峰期订单量巨大
- 不希望频繁扫数据库
二、RabbitMQ 延时队列的原理
核心是 TTL(Time To Live)和 DLX(死信队列)机制:
订单创建 → 延迟队列(TTL 30min) → TTL 到期 → 死信队列 → 消费 → 关闭订单
三、队列配置示例
{
"arguments": {
"x-message-ttl": 1800000,
"x-dead-letter-exchange": "order.dlx",
"x-dead-letter-routing-key": "order.expire"
}
}
四、Node.js 消费端实现
channel.consume('order.expire', async (msg) => {
const data = JSON.parse(msg.content.toString())
await closeOrder(data.orderId)
channel.ack(msg)
})
死信队列收到消息后立即处理。
五、优点
- 精准延迟
- 不扫库
- 不影响正常订单流程
- 高峰期稳定
六、最终效果
单机可支撑每小时百万级订单到期处理。
七、总结
RabbitMQ 延时队列非常适合:
- 订单自动取消
- 短信重试
- 超时重发
- 异步任务调度
强烈推荐用在对时间敏感的后端场景。