限制重试
毒消息不应永远阻塞队列。设置最大接收次数和死信目标,并在重试前给失败分类。超时或 503 之后可能成功;模式不匹配或授权失败不会。永久失败立即路由,瞬时失败走延迟重试。
让死信队列可观测
无人关注的死信队列是静默的数据丢失队列。对消息数量和最老消息年龄告警,并保留足够的诊断上下文:原始负载、错误类别、消费者版本和源位置。存储上下文前要脱敏。
{
"original": { "topic": "orders", "partition": 3, "offset": 91822 },
"error": "schema validation failed: missing customerId",
"consumerVersion": "1.8.2",
"attempts": 5
}
验证策略
预期结果:毒消息恰好被接收五次后进入死信队列,主队列继续处理新消息,死信队列在深度或年龄越界时告警。通过发布一条格式错误消息再发布一条合法消息来确认:合法消息被处理,错误消息带着源上下文被停放。只有消费者幂等且根因修复后才重放。
重放是一次发布
根因修复后再重放。确保消费者幂等,先重放到预发,并记录谁重放了什么。检查顺序要求和下游限流。让计数器翻倍或重复发送邮件的重放是新的故障,而不是恢复。