Files
msgexchange-v2/docs/spec-boundary-closure.md
T
windyboy d37a9eb38e docs(spec): 收敛领域边界闭合方案为三个缺口
- 本轮只做 G-KAFKA-D3 / G-IGNORE / G-EVENT-RETENTION,其余缺口不再写入 spec
- 删除约束与表结构副本、User Stories 重复、phase B 清单与进度记录
- US-04 AC1 明确先绑定身份再转 SKIPPED,引用改用稳定 ID US-03
2026-09-13 13:49:06 +08:00

98 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 精简实施方案
## 1. 本轮目标
关闭以下缺口:
1. `[G-KAFKA-D3]`:生产者配置满足 `D3`
2. `[G-IGNORE]``US-04` 定义的忽略报文正常终结。
3. `[G-EVENT-RETENTION]`:已确认投递的事件不会无限增长。
依赖约束仅引用:`D3``INV-7``INV-8``INV-9``INV-10``US-03``US-04`
## 2. 明确不做
本轮不实现:
- `[G-BACKFILL-BACKOFF]`:没有真实调参需求,保留现有退避算法。
- `[G-PROC-HST]``[G-HST-RETENTION]`:等待 `Q6``Q7``Q9` 定案后单独设计。
- `[G-FLOP-IDEMPOTENT]`:继续保持 `INV-20``CLM-3` 不可声明。
- `[G-REQ-TRACK]``[G-MAFL]``[G-REPLAY-CHANNEL]` 等其他缺口。
具体排期只记录在 Plane,不写入本 spec。
## 3. [G-KAFKA-D3]
实现:
- 将 Kafka producer 的有效 `PARAM:kafka.producers.default.max-in-flight-requests-per-connection` 固定为 `D3` 要求值。
- 启动时检查最终生效配置;不满足 `D3` 时拒绝启动。
- 不改变现有投递模型、批次、重试或 topic。
验收:
- 默认配置可以启动。
- 非法环境变量覆盖导致启动失败。
- `acks`、幂等和 `max-in-flight` 三项联合满足 `D3`
## 4. [G-IGNORE]
实现:
- 继续使用现有 XML 解码结果和 `MsgKind.Unsupported`,不增加新的领域类型或规则引擎。
-`MessageProcessor` 中按以下顺序处理:
解码 META
→ 绑定 `IDENTITY_KEY`
→ 匹配 `US-04` 忽略清单
→ 命中则写 `SKIPPED` + 回填意图
→ 未命中则进入现有 `MsgKind` 分派
- 忽略终态不取得 `PIPELINE_LOCK`,不写航班表,不创建 `MSG_EVENT`
- 使用 `LAST_ERROR=ignored:<rule>` 保存原因。
- 只增加 `US-04` 要求的忽略计数;指标名登记到 `reference.md`
验收:
- `US-04` 中全部规则及大小写场景均命中。
- 忽略消息先完成身份绑定(`US-03`)。
- 重复身份继续走既有 `duplicate-of` 路径。
- `SKIPPED` 与回填意图同语句落库。
- 不产生航班或 outbox 副作用。
- 未命中的合法类型继续按 `UNSUPPORTED` 处理。
## 5. [G-EVENT-RETENTION]
实现:
- 下一条 PG Flyway 迁移仅给 `MSG_EVENT` 增加可空 `SENT_AT`
- 所有投递确认操作在设置 `STATE='SENT'` 的同一条 `UPDATE` 中写入 `SENT_AT`
- `KAFKA:schd` 新代次重置为 `PENDING` 时清空 `SENT_AT`
- 迁移时将存量 `SENT` 行的 `SENT_AT` 设置为迁移时刻 `CURRENT_TIMESTAMP`,避免提前清理。
- 在现有 `JobRunner` 维护周期中增加一次有界清理,不新增线程或调度参数。
- 只删除同时满足以下条件的行:
```
STATE = 'SENT'
AND SENT_AT IS NOT NULL
AND SENT_AT < 当前时间 - PARAM:msgx.pipeline.event-retention
```
- 删除仍携带 `STATE='SENT'` 条件,避免与 `KAFKA:schd` 新代次 upsert 竞态。
- `PENDING`、`DEAD`、`SENT_AT IS NULL` 一律保留。
验收:
- 投递确认与 `SENT_AT` 原子写入。
- 存量 `SENT` 行迁移后不会立即过期。
- 到期 `SENT` 行被分批清理,未到期及其他状态不受影响。
- `KAFKA:schd` 重置与清理两种并发顺序均不误删。
- 清理可重复执行,不影响投递顺序。
## 6. 测试约束
- 时间测试统一使用 `TestClocks.kt`。
- 仓储行为使用内存适配器;迁移结构使用既有 Flyway 测试设施。
- 禁止 `Thread.sleep` 和真实外部基础设施。
- 只补上述三个缺口对应的回归,不扩展其他功能矩阵。