概述
一条格式错误的消息若被无限重投,会持续阻塞队列并掩盖真正的缺陷。先区分永久与瞬时错误,再以投递上限把毒消息转入死信,配以带上下文的告警,最后在根因修复后安全重放,既恢复数据又不重复生效。
关键步骤
- 区分错误类型,使永久错误不再无限重试。
- 设置投递上限,将消息转入死信队列。
- 死信到达时带头部信息告警。
- 修复后安全重放死信消息。
验证
- 毒消息滞留时正常流量仍流通。
- 重放产生恰好一次的效果。
- 告警包含可诊断的上下文。
- 根因与修复被记录。
决策点
应在有限次数后入死信而非无限重试;重放宜在修复后手动进行,自动定时重放仅限明确的瞬时情形。
适用范围
本条目围绕「毒消息处理工作流」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。
channel.consume(q, (msg) => {
try { handle(msg); channel.ack(msg); }
catch (e) {
if (msg.fields.redelivered && isPermanent(e)) channel.nack(msg, false, false); // -> DLQ
else channel.nack(msg, false, true);
}
});