标准答案
- 对幂等键建立唯一约束并保存参数摘要,参数不一致时返回冲突。
- 第一个请求写入 processing,完成后保存状态码和响应摘要;并发重复请求不能再次执行副作用。
- 进程崩溃后通过租约、查询业务状态或重试机制恢复 processing,不能永久锁死。
题目解析
幂等中间件要先用唯一约束抢占一个请求键,再把参数摘要、processing 状态和租约持久化。并发重复请求应等待、返回处理中或复用已保存结果,不能再次进入副作用代码。
成功结果可以复用,失败结果是否复用要按错误类型和重试语义决定;同一 Key 携带不同参数必须返回冲突。响应保存还要考虑大小、敏感字段和保留期。
进程崩溃会留下 processing,租约过期后不能盲目重做高风险操作,应先查询业务状态。幂等中间件是入口保护,数据库唯一约束和状态机仍是最终事实边界。
代码示例
持久化状态示意:
TypeScript
type IdempotencyRecord = {
key: string; requestHash: string;
status: "processing" | "succeeded" | "failed";
response?: unknown; leaseUntil?: number
}常见误区
- 误区:只在进程内 Map 去重。改正:使用共享持久化记录,覆盖多实例、重启和消息重放。
- 误区:同一 Key 不校验请求参数。改正:保存参数摘要,不一致时返回幂等键冲突。
- 误区:processing 永久保留。改正:使用租约、状态查询和人工恢复策略,避免任务永久锁死。