正文提到幂等记录需要保留期,但这里还要明确一个语义:记录一旦物理删除,迟到的旧请求会被当成新请求执行,数据库唯一约束无法区分它是延迟重试还是新的业务意图。仅设置 created_at 并定时清理,实际上把重复副作用风险推迟到了保留期之后。
可以把保留期定义为接口契约中的最大重试窗口,并采用两阶段清理:窗口内保留完整响应;窗口结束后先删除较大的响应内容,但保留 (tenant_id, operation, key, request_hash) 墓碑到业务可接受的去重期限。命中墓碑时返回“结果已过期、不可回放”,而不是再次执行业务。若确实允许同一调用方发起新意图,应要求生成新键,不要靠旧键过期来复用。
可复现验收可加入一项延迟请求:首次请求成功后推进时钟越过完整响应保留期,再重放同一键,确认业务记录和 outbox 都不增加;只有使用新键时才产生新结果。同时让清理任务与重放请求并发运行,确认墓碑写入或裁剪响应是原子的,不会出现记录短暂消失而让旧请求穿透的窗口。