1. 客户端重试在请求已执行但响应丢失时会造成什么语义,幂等键应保存哪些状态?
客户端重试在"请求已执行但响应丢失"时会引入什么语义问题?幂等键(Idempotency-Key)机制应保存哪些状态?
- 超时重试与"响应丢失、请求已执行"的不确定性
- 幂等键的生成、保存与冲突处理
- 服务端幂等存储的状态结构与过期策略
客户端超时并不代表请求未执行:请求可能已在服务端生效,只是响应在回程中丢失(网络抖动、代理超时、连接复用中连接关闭)。此时盲目重试会把同一操作执行两遍——创建订单、扣款、发消息等场景会产生重复副作用,即"at-least-once 语义下的重复投递"。幂等键机制把语义拉回"恰好一次":客户端为每个逻辑操作生成全局唯一键(UUID),随请求头(如 Idempotency-Key)发送;服务端以键为唯一约束保存执行结果,重复请求直接返回已保存的首次响应,不再重复执行。
服务端幂等存储需要保存的状态包括:幂等键本身、首次请求的请求摘要(方法、路径、参数哈希,防止同键不同请求)、执行结果(响应状态码、响应体或业务结果)、以及过期时间(TTL,如 24 小时,避免无限增长)。冲突处理策略:同键同参数返回首次结果;同键不同参数返回 409 或 422 提示键已被使用;键过期后允许复用需谨慎(可能造成重复执行)。客户端侧还应记录"已发送但未确认"的键集合,重试时必须复用同一键,绝不可换新键;工程上键可与请求体中幂等字段(订单号、支付单号)绑定,配合唯一索引双保险。
回答的起点是"超时 ≠ 未执行",由此引出重试的重复语义;幂等键的价值在于把"不可知"变成"可查询":服务端用键状态回答"这次请求之前是否已处理过"。状态清单(键、摘要、结果、TTL)与冲突处理是工程落地的核心,能答出唯一索引与响应缓存即为完整答案。