Files

31 lines
2.3 KiB
Markdown
Raw Permalink Normal View History

2026-08-26 06:41:07 +08:00
# 幂等、事务审计与可靠待办设计 V0.1
## 幂等执行
- 副作用接口以“调用主体 + 接口作用域 + `Idempotency-Key`”作为唯一范围。
- 请求正文计算SHA-256摘要;同一键和相同摘要返回第一次已提交结果。
- 同一键对应不同请求摘要时返回冲突,不能执行第二次业务操作。
- 幂等记录、业务写入、审计事件和outbox事件必须在同一个PostgreSQL事务中提交。
- 事务内只保存业务意图,不调用第三方网络服务。
- 当前实现通过数据库唯一约束串行化并发请求,五个并发请求的集成测试只执行一次操作。
## 事务审计
- 审计记录接受平台用户公开编号,不记录OIDC Token、内部主键、字幕正文或录音地址。
- 业务操作回滚时,同一事务内的审计记录同步回滚;业务提交时审计同步提交。
- 审计结果使用`success/failure/denied`稳定值,细节只保存诊断需要的非敏感字段。
## outbox可靠待办
- 业务事务通过`outbox.Store.Enqueue`写入待办,支持租户、聚合对象、事件类型和去重键。
- 相同去重键与相同正文返回原事件;相同去重键与不同正文拒绝。
- Worker使用`FOR UPDATE SKIP LOCKED`批量领取任务,领取时写入Worker编号和锁定时间。
- 处理成功进入`completed`;只有显式临时错误、超时、网络中断和被分类为临时的供应商、对象存储或数据库错误才按指数退避重新进入`pending`;业务错误、永久错误和未注册处理器立即进入`dead`。
- 进程崩溃后,超过锁定期限的`processing`任务可被其他Worker重新领取。
- 日志只记录事件编号、事件类型、次数和稳定错误码,不记录事件正文。
- V26为作业增加公开编号和人工重试元数据。运营人员只能重试当前进程已注册、状态为`dead`的事件类型;服务端重置本轮自动尝试计数,但累计保留人工重试次数、时间、操作人、原因和审计,不向运营页面暴露事件正文。
## 当前事件处理器
当前已注册通话房间、供应商启动/停止及对账、内容提取、记忆索引/删除、隐私访问/删除、私有导出和媒体校验处理器。`platform.noop`只用于验证完整领取、人工重试与完成链路。