← 中文资源

简体中文版本

毒消息处理工作流

识别反复失败的消息、限制重投次数、将其路由到死信队列,并在修复后提供安全重放路径。

阅读英文原文

概述

一条格式错误的消息若被无限重投,会持续阻塞队列并掩盖真正的缺陷。先区分永久与瞬时错误,再以投递上限把毒消息转入死信,配以带上下文的告警,最后在根因修复后安全重放,既恢复数据又不重复生效。

关键步骤

  1. 区分错误类型,使永久错误不再无限重试。
  2. 设置投递上限,将消息转入死信队列。
  3. 死信到达时带头部信息告警。
  4. 修复后安全重放死信消息。

验证

  • 毒消息滞留时正常流量仍流通。
  • 重放产生恰好一次的效果。
  • 告警包含可诊断的上下文。
  • 根因与修复被记录。

决策点

应在有限次数后入死信而非无限重试;重放宜在修复后手动进行,自动定时重放仅限明确的瞬时情形。

适用范围

本条目围绕「毒消息处理工作流」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。

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);
  }
});