下游超时后重试五次,日志里出现五条一模一样的 ERROR,告警系统按条数统计,一次故障触发了 320 条告警。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

logger.warn("call payment timeout, retry {}/{}, orderNo={}", i, max, orderNo);
logger.error("call payment failed after {} retries, orderNo={}", max, orderNo);

重试逻辑在每次尝试里都打 error,没有区分最终失败和中间重试。告警规则按 error 条数阈值触发,重试被当成了多次独立故障。这一点先确认清楚,后面就不用反复试。

「重试日志刷屏」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,中间重试打 warn 并带上第几次 最终失败才打 error;日志里加 retryCount 和 maxRetry 字段;告警按 traceId 去重 同一请求只报一次;把重试次数接进指标 而不是靠日志数。

改完照着核一遍,一次失败只产生一条 error 告警数量回落到 1。

作者 9823189