docs(lifecycle): 补齐清除生命周期与逐对象归档边界
- design.md 9.3 扩为「生命周期与清除」:清除通则、逐对象生命周期表、 处理终态归档判据(终态 ∧ 回填了结 ∧ 终局后到期)与时间常数排序 - contracts.md 新增 C-16:回填放弃清单在对应信箱边界清除前必须保持可查 - invariants.md 缺口索引新增 G-HST-RETENTION、G-FLIGHT-HIST-RETENTION、 G-REQ-TRACK-RETENTION - flight-state.md 补航班历史存储保留期开放项 - 同步 architecture.md / user-stories.md 的 9.3 交叉引用
This commit is contained in:
+43
-4
@@ -30,7 +30,7 @@
|
||||
| `FLIGHT_SCHD` | 航班标量及单值异常字段 | `FLID` 主键;`OPERATION_DAY` 一经确定不可变;版本与最近消息 ID 用于追踪。现有变长集合存于 8 张资源明细表与 `FLIGHT_ROUTE_POINT`;`SRVT`/`VIPF` 专用明细尚未实现 `[G-SRVT-VIPF]`,规则见 flight-state.md。 |
|
||||
| `INBOX_CURSOR` | 消费水位 `W`、空洞计时 `holeSince`、播种事实 `SEEDED_AT` | 单行游标;`W` 只随新 ID 成功入队推进,遇空洞即停;`HOLE_SINCE` 持久化空洞观测时刻,进程重启不丢计时。`SEEDED_AT IS NULL` **不等于**从未消费(已有库新增列后同样为 NULL)。 |
|
||||
| `SCHD_SNAP_LOG` | 日计划处理留痕 | 只追加、可重建,不参与状态决策;保留期见 reference。 |
|
||||
| `PROC_STATE_HST` | 终态处理记录的归档目标 | 尚未建表 `[G-PROC-HST]`;只归档到自有 PG 的目标表,不落共享库历史表。 |
|
||||
| `PROC_STATE_HST` | 终态处理记录的归档目标 | 尚未建表 `[G-PROC-HST]`;只归档到自有 PG 的目标表,不落共享库历史表;自身保留期与清除作业未定义 `[G-HST-RETENTION]`。 |
|
||||
|
||||
字段与索引以 `src/main/resources/db/migration/` 的迁移链为准(Oracle 11g 目录为占位,未接入 Flyway)。报文原文仍从共享信箱读取,原文保留期必须覆盖处理与重放窗口(`C-7`)。
|
||||
|
||||
@@ -316,13 +316,52 @@ PENDING → SENT → DONE
|
||||
| 投递目标已接受、`SENT` 未置 | 事件仍 `PENDING` | 允许重发,消费方按事件身份去重 |
|
||||
| PG 从备份恢复 | 终态与事件回退到备份点 | 按至少一次接受重复;不重放业务、不据此改写航班 |
|
||||
|
||||
### 9.3 维护作业与归档
|
||||
### 9.3 生命周期与清除
|
||||
|
||||
`JobRunner` 用独立 daemon 线程按周期触发回填扫描、航班历史清理与留痕清理;作业不参与消息 FIFO,也不使到期消息饥饿。`INV-18` 要求历史清理的删除与主泵处理互斥。
|
||||
`JobRunner` 用独立 daemon 线程按周期触发回填扫描、航班历史清理与留痕清理(终态归档为待交付项 `[G-PROC-HST]`);作业不参与消息 FIFO,也不使到期消息饥饿。`INV-18` 要求历史清理的删除与主泵处理互斥。
|
||||
|
||||
**通则**(对本系统所有持久对象适用)
|
||||
|
||||
- **时间不构成清除依据**:到期只是必要条件,**终局证据才是充分条件**(共享库见 `C-8`,航班见 `D1`)。
|
||||
- **归档不是终点**:归档目标是新的无界集合,必须有独立保留期与清除作业 `[G-HST-RETENTION]`,否则只是把容量问题从热表移到冷表。
|
||||
- **证据不随清除消失**:清除所依赖的证据(如 `C-8` 引用的回填放弃清单,本期承诺见 `C-16`)在其覆盖的信箱边界被清除前必须保持可查。
|
||||
- **证据缺失或结果不明时按最保守处置**:航班清理为删 0 条(`D1`)。
|
||||
|
||||
**逐对象生命周期**(保留期取值一律见 reference)
|
||||
|
||||
| 对象 | 终局判据 | 归档目标 | 清除证据 | 执行方 | 缺口 |
|
||||
|---|---|---|---|---|---|
|
||||
| 共享信箱 `CMINMSGS` 原文 | 处理标记 / 回填放弃清单 | 库方历史表(`C-9` 方案 B) | `C-8` | 库方 | 契约未确认(`Q6`/`Q7`/`Q9`) |
|
||||
| `FLIGHT_SCHD` + 资源明细 | 判史规则 | 历史存储 | 归档确认 + 版本复查 | 我们 | — |
|
||||
| 航班历史存储 | 保留期 | — | — | 我们 | `[G-FLIGHT-HIST-RETENTION]` |
|
||||
| `SCHD_SNAP_LOG` | 保留期 | 无(本地可重建) | 无 | 我们 | — |
|
||||
| `MSG_EVENT` 已发送行 | `SENT` | 无 | 无 | 我们 | `[G-EVENT-RETENTION]` |
|
||||
| `PROC_STATE` 终态行 | 见下 | `PROC_STATE_HST` | 回填了结 | 我们 | `[G-PROC-HST]` |
|
||||
| `PROC_STATE_HST` | 保留期 | — | — | 我们 | `[G-HST-RETENTION]` |
|
||||
| `REQ_TRACK` 关闭态行 | 保留期 | 无 | 无 | 我们 | `[G-REQ-TRACK-RETENTION]` |
|
||||
|
||||
原文副本是**条件对象**:仅当库方清除语义不满足 `C-6` 时才成立(`[G-REPLAY-CHANNEL]`、`CLM-5`),窗口与 `R_keep` 相同,落在自有 PG。
|
||||
|
||||
**处理终态归档**(`PROC_STATE` → `PROC_STATE_HST`)
|
||||
|
||||
候选 = 终态 **且** 回填已了结 **且** 终局后经过归档阈值。两处不可省:
|
||||
|
||||
- **回填已了结** = `BACKFILL_AT` 非空,或已放弃 **且经人工对账**。放弃行不写标记,是 `C-8` 的清除授权证据,未对账前不得归档。
|
||||
- **删除前复查** = `DEAD` 可被人工重放改回 `PENDING`,故必须在 `PIPELINE_LOCK` 内复查 `STATE` 未变再删,与航班历史清理同形(`INV-18`)。
|
||||
|
||||
归档范围只含终态;归档后仍须保留业务去重能力(`INV-9`)——去重记忆期长于工作状态在线期,两者同行时只能二选一。
|
||||
|
||||
**时间常数排序**(取值见 contracts.md)
|
||||
|
||||
1. `R ≤ R_keep`(`C-7`)。
|
||||
2. 去重记忆期 ≥ `R_keep`;否则「归档后重复」不成立(`INV-9`)。
|
||||
3. 回填放弃清单可见期 ≥ `R_keep`;否则库方清除缺 `C-8` 依据(`C-16`)。
|
||||
4. 归档阈值计的是**终局之后**的时间,不是入队之后:终态行未了结回填时不进入候选。
|
||||
|
||||
**其余清理**
|
||||
|
||||
- **航班历史清理**:按 reference 的历史判据选候选(含 `DELETED`),先成功归档再删除;未经 FDEL 的生命周期清除需先补发删除事件。语义与红线见 flight-state.md。
|
||||
- **留痕清理**:`SCHD_SNAP_LOG` 按保留期与 `(SCOPE_END, RECV_AT)` 删除,不依赖历史存储开关。
|
||||
- **处理终态归档**:`PROC_STATE` 终态记录归档至 `PROC_STATE_HST`(尚未建表 `[G-PROC-HST]`)。归档范围只含终态;归档后仍须保留业务去重能力。
|
||||
- **出站事件清理**:见投递清理规则。
|
||||
|
||||
共享信箱保留策略由库方管理(contracts「保留与清除」)。历史写入与删除事件入队之间仍需恢复方案;顺序调用不构成原子提交。
|
||||
|
||||
Reference in New Issue
Block a user