用途:确保操作无论执行多少次都产生相同结果,避免重复请求造成重复扣款、重复下单等问题。适用于支付处理、订单创建、Webhook 处理、邮件发送,以及任何重复执行会引发问题的操作。
主要能力:提供幂等键模式,通过请求头 idempotency-key 识别请求;使用 Redis 缓存已处理响应,命中缓存时直接返回原状态码与响应体,并以 24 小时 TTL 存储。提供数据库支撑的幂等方案,建 idempotency_keys 表,字段含 key、request_hash、response、status、created_at、expires_at,并用 ON CONFLICT DO NOTHING 保证只有一个请求插入成功并负责处理。处理中状态为 processing,完成后写 completed 与响应,出错写 failed 与错误信息。对已存在键会校验 request_hash 是否一致,不一致则报错,防止同一键被用于不同请求。
使用方式:在变更类接口上要求携带幂等键;用 Redis 中间件缓存响应,或用数据库原子插入抢占处理权;对已完成请求返回缓存响应,对处理中请求提示稍后重试,对失败请求抛出上次错误。需实现过期键清理,可用 PostgreSQL 定时任务批量删除(如 LIMIT 1000)、Node.js 定时任务或 Python 异步清理任务,建议在低峰期执行并监控任务。
限制与注意:资料未提供具体安装命令、依赖版本、收费或平台信息。需自行处理键过期与表膨胀,注意清理时的锁竞争,可考虑按 created_at 分区。