网关在 5 秒超时后自动重试三次,第三次成功返回,但供应商账单里这条请求出现两笔 completion,两笔都带完整输出,月底对账被财务标了红。
一开始怀疑是「重试被路由到不同区域,同一请求无法归并」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。第一次超时只是客户端放弃,服务端仍在生成并计费。少数情况下是重试没有带幂等键,服务端当成新请求。
少数情况下是计费以请求为单位,不看最终是否只采用了一份响应。
生成幂等键并在重试时复用
python -c "import uuid;print(uuid.uuid4())"
接着把幂等键放进请求头透传
python -c "print('Idempotency-Key: <uuid>')"
然后对账时按幂等键归并差额
python reconcile.py --bill bill.csv --mode idem
客户端超时调到大于生成耗时的 P99
python -c "print('timeout > p99_gen_seconds')"
改完先别撤,确认这几项。同一幂等键在账单里只有一条计费记录,对账差额小于 0.5%,重复重试不再产生第二笔。
这里还有个坑。幂等键必须由业务生成并在每次重试时保持不变,随手新生成一个等于没做幂等,供应商认不认要实测。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
