腾讯混元 2024-09 的对话接口要求每次请求带 X-TC-TraceId,客户端重试时复用了同一个 id,返回 400,原文 TraceId duplicated,换新 id 后通过,可重试链在日志里就断了。
一开始怀疑是「幂等重试直接复制了整个 header 字典」,查了一圈,方向不对。
原因不止一个,得分开看。TraceId 要求全局唯一,重试不能复用同一个值。还有一种是SDK 把 header 缓存在 client 实例上,多次 send 用的同一份。
不容易想到的是,用业务订单号当 TraceId,同一订单第二次请求必然重复。
每次请求前重新生成一个 uuid 作为 TraceId
python -c "import uuid;print(uuid.uuid4().hex)"
然后用 curl 带新 id 验证接口是否恢复
curl -X POST https://hunyuan.tencentcloudapi.com -H "X-TC-TraceId: $(python -c "import uuid;print(uuid.uuid4().hex)")" -H "Content-Type: application/json" -d @req.json
随后在拦截器里统一注入,禁止业务代码手写
python -c "import uuid;h={'X-TC-TraceId':uuid.uuid4().hex};print(h)"
剩下的就是把业务幂等键放到自定义 header,别占用 TraceId
python -c "print({'X-Idem-Key':'order-20261113-001'})"
恢复的判定其实很直接。重试三次都返回 200,网关日志里三次 TraceId 各不相同,而自定义幂等键保持一致。
TraceId 是用来串链路的,不是用来做幂等的,两件事混在一个字段上,要么重试被拒,要么链路查不清。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
