网络超时重试会不会重复下单?Idempotency-Key 怎么实现?并发的重复请求怎么挡?这篇用真实的超时重试与 6 个并发请求,把朴素实现和原子实现的差别量出来。
第一次请求:客户端超时 → TimeoutError
重试: 201 {"id":2}
结果:库里有 2 个订单(用户只下了一单)上一篇:RESTful URL 设计;下一篇:API Token 认证。
第一次: 201 {"id":1} | 耗时 389 ms
第二次: 201 {"id":1} | Idempotent-Replayed = true | 耗时 4 ms
库里订单数: 1
同一个 key 换了请求体 → 422 {"error":"Idempotency-Key reused with a different request body"}
不带 key → 400 {"error":"Idempotency-Key required"} 朴素:先查,没有再写 状态码分布 {201: 6} | 库里订单数 6
原子:先 INSERT key 占位 状态码分布 {409: 5, 201: 1} | 库里订单数 16 个线程同时发出相同 key 的请求,服务端处理时间 0.5 秒来放大竞争窗口。