标准答案

  1. 对幂等键建立唯一约束并保存参数摘要,参数不一致时返回冲突。
  2. 第一个请求写入 processing,完成后保存状态码和响应摘要;并发重复请求不能再次执行副作用。
  3. 进程崩溃后通过租约、查询业务状态或重试机制恢复 processing,不能永久锁死。

题目解析

幂等中间件要先用唯一约束抢占一个请求键,再把参数摘要、processing 状态和租约持久化。并发重复请求应等待、返回处理中或复用已保存结果,不能再次进入副作用代码。

成功结果可以复用,失败结果是否复用要按错误类型和重试语义决定;同一 Key 携带不同参数必须返回冲突。响应保存还要考虑大小、敏感字段和保留期。

进程崩溃会留下 processing,租约过期后不能盲目重做高风险操作,应先查询业务状态。幂等中间件是入口保护,数据库唯一约束和状态机仍是最终事实边界。

代码示例

持久化状态示意:

TypeScript
type IdempotencyRecord = {
  key: string; requestHash: string;
  status: "processing" | "succeeded" | "failed";
  response?: unknown; leaseUntil?: number
}

常见误区

  • 误区:只在进程内 Map 去重。改正:使用共享持久化记录,覆盖多实例、重启和消息重放。
  • 误区:同一 Key 不校验请求参数。改正:保存参数摘要,不一致时返回幂等键冲突。
  • 误区:processing 永久保留。改正:使用租约、状态查询和人工恢复策略,避免任务永久锁死。

作者信息