Node.js MQ 高级 — 延时消息 & 死信队列
延时消息
消息发送后不立即被消费,而是等待指定时间后再投递。
实现方式
通过 TTL(超时) + 死信交换机(DLX) 组合实现:
Producer → 普通 Exchange → 延时队列(带 TTL, 无消费者)
↓ (TTL 过期)
死信 Exchange → 死信队列 → Consumer配置步骤
js
// 1. 延时队列:设置 TTL 和死信交换机
channel.assertQueue('delay_queue', {
deadLetterExchange: 'dlx_exchange', // 过期后转发到死信交换机
deadLetterRoutingKey: 'task',
messageTtl: 10000, // 10秒后过期
})
// 2. 死信队列:绑定到死信交换机
channel.assertQueue('dlx_queue')
channel.bindQueue('dlx_queue', 'dlx_exchange', 'task')
// 3. 消费者监听死信队列
channel.consume('dlx_queue', (msg) => {
console.log('延时消息到达:', msg.content.toString())
channel.ack(msg)
})应用场景
| 场景 | 说明 |
|---|---|
| 订单超时取消 | 下单 30 分钟未支付 → 自动取消 |
| 延时通知 | 预约活动前 5 分钟提醒 |
| 重试机制 | 失败消息延时后自动重试 |
| 定时发布 | 文章定时发布 |