完善公共基础接入与全局审计闭环
This commit is contained in:
@@ -302,7 +302,7 @@ func (e WalletDebitedEvent) OccurredAt() time.Time { return e.occurredAt }
|
||||
```text
|
||||
数据库事务
|
||||
├── 保存聚合
|
||||
├── 保存操作日志
|
||||
├── 保存 Audit Event(该动作需要审计时)
|
||||
└── 保存 Outbox 事件
|
||||
提交事务
|
||||
↓
|
||||
@@ -330,9 +330,20 @@ func (uc *DebitWalletUseCase) Execute(ctx context.Context, cmd DebitCommand) err
|
||||
```
|
||||
|
||||
- Outbox 写入失败:事务回滚,避免“业务成功但关键事件永久丢失”。
|
||||
- 高风险成功操作的 Audit Event 写入失败:事务回滚,避免“业务事实存在但无法回答谁做了什么”。业务已回滚后的失败或拒绝审计使用独立短事务,禁止裸 goroutine。
|
||||
- Asynq 暂时不可用:不回滚已提交业务,Relay 后续重试。
|
||||
- 消费者必须幂等;涉及余额、退款、充值时使用业务键或状态条件更新。
|
||||
|
||||
### 公共能力决策
|
||||
|
||||
每个新增或修改的完整用例都必须在 PRD/Ticket 中明确以下决定,不能只写“接入公共基础”:
|
||||
|
||||
- 是否写 Audit Event;若否,写明 N/A 理由,并增量维护全系统审计覆盖基线;
|
||||
- 是否已有 Domain Ledger 作为金额、订单或状态事实,Audit Event 不得替代它;
|
||||
- 是否存在外部请求或回调,需要 Integration Log;
|
||||
- 是否存在提交后可靠副作用,需要同事务 Outbox,并明确事件类型、版本和消费者幂等键;
|
||||
- 最终发布门禁所依赖的具体公共 Ticket,不得使用无法判断完成状态的模糊依赖。
|
||||
|
||||
---
|
||||
|
||||
## 八、仓储接口
|
||||
|
||||
Reference in New Issue
Block a user