Skip to content

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 分钟提醒
重试机制失败消息延时后自动重试
定时发布文章定时发布