腾讯混元 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 是用来串链路的,不是用来做幂等的,两件事混在一个字段上,要么重试被拒,要么链路查不清。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189