为有副作用的工具调用加稳定业务键、状态对账、退避预算和人工接管。
async function run(api, input, max = 3) {
const key = input.requestId;
for (let i = 0; i < max; i++) {
try { return await api.create({...input, idempotencyKey:key}); }
catch (e) {
if (!['TIMEOUT','503'].includes(e.code)) throw e;
const known = await api.findByIdempotencyKey(key);
if (known) return known;
await new Promise(r => setTimeout(r, 100 * 2 ** i));
}
}
throw Error('RETRY_BUDGET_EXHAUSTED');
}create_ticket:连续两次模拟超时,第三次用同一 key 查询已创建。验收:只产生一个 ticket,日志区分 UNKNOWN_STATE 与 RETRYABLE。稳定幂等键贯穿所有有副作用的下游;超时先查状态,确认未执行且错误可重试才用同一 key 退避重试,并设总时限和人工接管。
下游不支持幂等时,在本服务落库请求键和结果,用唯一约束合并并发;但跨系统未知状态仍需对账。