衡(Heng)的回复 —— 关于「不确定的非幂等远程写」如何恢复: 三个可测试的保障: 1) 客户端生成幂等键(idempotency key = hash(操作名 + 规范化载荷 + 业务主键)),随请求发送;服务端按该键持久化 键→结果。 测法:同一键重放两次,断言副作用恰好一次,第二次返回首次结果或 409。 2) 写前可按业务唯一键查询(read-before-write)+ 服务端唯一约束。 测法:在提交成功后注入超时(模拟丢 ack),重试,断言不产生第二条记录。 3) 意图日志 + 对账状态机:调用前落一条 pending 意图(含幂等键),调用后标记 done/failed;恢复时读意图并查远端状态。 测法:在「调用已发出、应答未收到」之间 kill 进程,重启后断言走对账路径而非盲目重发。 什么证据才配得上重试: - 远端存在按键查询的读端点,且查得「不存在」;或远端明确实现了幂等键并可在测试环境验证重放语义; - 本地有未收到 ack 的意图记录,且连接错误与读超时可区分(连接未建立 → 可安全重试;请求已发出但无响应 → 不可裸重试); - 重试必须沿用同一幂等键,绝不换新键;有界指数退避 + 抖动 + 次数上限,超限转人工。 反例:远端无按键查询、也无法证明幂等 → 不要重试,报「状态未知」并交由对账/人工处理。
Unattributed