docs(acm2-75): 清理空转待决项并对齐全仓旧编号引用
- 删 Q2/Q15/Q19/Q20:时钟偏斜不进判据、实现自定已是结论、原文留存已定、 运营日冲突处置已由 DEAD(PROTOCOL) 定 - Q6 的 abdg 定案本版不提供;Q22 改为 13 类报文到 admin-api 实体表组的映射 (REF_MASTER 单表口径退位);Q23 收窄为 SODT+FLID 幂等重试 - C-1 自清口径四方同步(requirements 非目标、US-03 AC2、architecture §6) - INV-2 吸收回填只写空值;§7 恢复 G-RESP-GUARD - architecture/implementation/README/V1/oracle/Kotlin/seed 中 40+ 处旧编号 按映射重指,check-docs 全绿
This commit is contained in:
+4
-4
@@ -27,12 +27,12 @@
|
||||
|
||||
| 事实 | 唯一归属 | 其他文档怎么写 |
|
||||
|---|---|---|
|
||||
| 收报扫描谓词与幂等登记 | implementation.md「收报」 | specification.md 写对库方的承诺 `C-30`;reference.md 写参数 |
|
||||
| 收报扫描谓词与幂等登记 | implementation.md「收报」 | specification.md 写对库方的承诺 `INV-1`;reference.md 写参数 |
|
||||
| 保留期下界 `R_keep`、清除前置条件 | specification.md「约定」 | implementation.md 只写行为约束;执行步骤在上线前另立 |
|
||||
| 处理标记(处理时间)写权限 | specification.md 术语「处理标记」;`US-10` | implementation.md「回填」(只填空值、不覆盖) |
|
||||
| 回填四结果、放弃语义、`R` 的作用 | implementation.md「回填」 | specification.md 记结论与可声明性 |
|
||||
| 退避 / `claim-batch` / 回填期限等取值 | reference.md「参数」 | 其余文档只引 `PARAM:<key>` |
|
||||
| 消费权排他、ID 不复位、报文不可变、时钟、单实例 | specification.md「前提」 | 其他文档只引 `PRE-x` |
|
||||
| 前提:测试隔离 | specification.md「前提」 | 其余前提各归其位:编号单调不复用 `Q7`、报文不可变 `Q4`、单实例 `OPS-1`、时间判据用本地时钟(implementation.md「回填」) |
|
||||
| 航班身份、合并语义、`OPERATION_DAY` | implementation.md「航班域」 | 其余文档只引域规则与 `INV-x` |
|
||||
| 航班动态逐类语义与空标签规则(FLOP) | implementation.md「动态运行事件」 | specification.md 记 `Q3` 与 `G-*`;requirements.md 写验收口径 |
|
||||
| SIS 消息中的参考数据类别、结构与资源状态 | implementation.md「静态参考数据」 | requirements.md 写取数与刷新验收;admin-api 只从处理后的业务数据库读取 |
|
||||
@@ -48,7 +48,7 @@
|
||||
- `C-x`、`INV-x` 用加粗定义行(`- **C-5** …`);
|
||||
- `CLM-n`、`OPS-n`、`Dn`、`PRE-n`、`Qn`、`G-NAME` 与 `PARAM:<key>` 用注册表首列;首列必须是**单个裸 ID**
|
||||
(`` `ID` `` 或 `ID`)。成组登记(`` `a` / `b` ``)、带括注的首列与写成 `` `ID` `` 的引用行都不算定义。
|
||||
- 同一行登记多个 ID(如验证映射的 `INV-17b`、`INV-23`)是引用行,不构成定义。
|
||||
- 同一行登记多个 ID(如验证映射的 `INV-3`、`INV-10`)是引用行,不构成定义。
|
||||
其他位置一律是引用。
|
||||
- 编号稳定:条款被取代时标 `[作废 by C-y]` 并保留原文;不静默改写,不重编号。
|
||||
- **引用只用稳定 ID**,不用章节号:写 `US-03` AC1、`C-8`、`PARAM:msgx.pipeline.claim-batch`,或「见 implementation.md『收报』」这类文件名 + 小节名指针。章节号随增删章节腐烂,指针失效后必然被改写为复述。
|
||||
@@ -75,5 +75,5 @@
|
||||
## 6. 不建的文件
|
||||
|
||||
- 顶层不再增加 Markdown:`docs/` 顶层固定为上述 6 个文件加允许的专题目录。
|
||||
- 不建运行规程文件:设计阶段没有可执行的运行环境,操作步骤在上线/切流前另立(`docs/runbooks/*.md`);设计阶段需要的只有前置条件与红线,它们分别在 specification.md(`C-1`、`C-12`)与 specification.md 的 `CLM-x`。
|
||||
- 不建运行规程文件:设计阶段没有可执行的运行环境,操作步骤在上线/切流前另立(`docs/runbooks/*.md`);设计阶段需要的只有前置条件与红线,它们分别在 specification.md「前提」与 architecture.md「必须保持的约束」、specification.md 的 `CLM-x`。
|
||||
- 声明边界与 Plane 分离:未交付、未确认、不可声明的主张记在 specification.md,逐项处置在 Plane(ACM2),不在正文逐段标注。
|
||||
|
||||
+16
-16
@@ -8,12 +8,12 @@ msgexchange-v2 是 OMMS H5 查询系统的消息网关,替换旧版 `msgexchan
|
||||
|
||||
功能需求是 [requirements.md](requirements.md) 的十四条用户故事(采集、处理、投递、查询、维护,`US-01`~`US-14`),运行需求是四条验收(单实例、可观测、测试隔离、切换回退,`OPS-1`~`OPS-4`)。不生成航班/业务数据类报文,不替代 CIIMS/AODB,不调用 admin-api;完整非目标见同文件「范围与非目标」。
|
||||
|
||||
- **主要入口**:轮询共享 MySQL 入站表 `CMINMSGS`,只取处理时间为空的行,按编号升序、每批有上限(`US-01`;`INV-2b`)。
|
||||
- **主要入口**:轮询共享 MySQL 入站表 `CMINMSGS`,只取处理时间为空的行,按编号升序、每批有上限(`US-01`;`INV-1`)。
|
||||
- **兼容入口**:`POST /cminmsgs/send` 供联调工具把报文写进信箱,与上游投递走同一条处理路径;返回的编号只表示已进信箱,不代表已处理或下游已收到(`US-02`)。
|
||||
- **查询入口**:`GET /all/flights` 返回当前全部动态航班(不含共享航班),读 Redis,与网页客户端同源(`US-12`;`INV-24`)。
|
||||
- **查询入口**:`GET /all/flights` 返回当前全部动态航班(不含共享航班),读 Redis,与网页客户端同源(`US-12`;`INV-11`)。
|
||||
- **出站**:只向 AODB 发参考数据请求 `RQRD` 和日计划请求 `RQFD`,经共享 MySQL 出站表 `COUTMSGS`,由 CIIMS adapter 消费;只保证请求写入信箱,不保证 AODB 收到(`US-09`;`C-4`)。
|
||||
- **输出**:Kafka 主题 `msg` 发单条航班变更、`schd` 定时发批量最新状态;Redis 存航班投影;静态参考数据表供 admin-api 只读(`US-08`、`US-13`)。
|
||||
- **权威**:航班当前态的权威是自有 PostgreSQL(`FLIGHT_SCHD`、资源明细表、`FLIGHT_ROUTE_POINT`);信箱、Redis、Kafka、展示视图都不是(`INV-11b`)。
|
||||
- **权威**:航班当前态的权威是自有 PostgreSQL(`FLIGHT_SCHD`、资源明细表、`FLIGHT_ROUTE_POINT`);信箱、Redis、Kafka、展示视图都不是(`INV-5`)。
|
||||
- **航班历史**:已结束航班先写入 Elasticsearch 历史库,成功后才从实时数据删除(`US-14`;`D1`)。
|
||||
|
||||
测试环境用 PostgreSQL;生产环境用 PostgreSQL 还是 Oracle 11g 尚未确定,Oracle 适配验证通过前不作支持承诺(生产库选型见 `Q14`)。
|
||||
@@ -41,7 +41,7 @@ delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 /
|
||||
|
||||
四组线程在同一进程、互不调用,协作只经自有 PG 的持久记录交接;HTTP 接口走事件循环,不占这四组线程。重启后各段从记录接着做,不依赖内存进度(`US-01` AC4、`US-03` AC3、`US-10` AC2)。
|
||||
|
||||
线程之间不加锁,靠幂等写入:收报按信箱编号只登记一次(`US-01` AC2)、回填只写空标记(`C-15`)、记录清理只删已回填且超过保留期的行(`US-11`);发生竞争时后到的操作复查状态并重试。主泵与航班历史清理对实时航班表的互斥是实现手段,用以落实「正在被消息处理的航班跳过」(`US-14` AC4)。
|
||||
线程之间不加锁,靠幂等写入:收报按信箱编号只登记一次(`US-01` AC2)、回填只写空标记(`INV-2`)、记录清理只删已回填且超过保留期的行(`US-11`);发生竞争时后到的操作复查状态并重试。主泵与航班历史清理对实时航班表的互斥是实现手段,用以落实「正在被消息处理的航班跳过」(`US-14` AC4)。
|
||||
|
||||
运行边界:同一时刻只允许一个实例处理消息(`OPS-1`);切换与回退以信箱处理标记交接,本系统内部处理和回填进度保存在自有 PG 的 `PROC_STATE`,停旧启新时未处理的消息由旧系统继续(`OPS-4`);积压、处理失败、投递失败、回填失败各有指标与告警(`OPS-2`)。
|
||||
|
||||
@@ -54,7 +54,7 @@ delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 /
|
||||
| `ingress` | 轮询信箱、登记入队、兼容入口落信(`US-01`、`US-02`);不解析业务报文。 |
|
||||
| `codec` | XML 解码,区分非法报文与可修复的解码失败(`US-03`)。 |
|
||||
| `processing` | FIFO 调度、业务身份绑定与去重、领域决策与落库(`SCHD`/`FLOP`/`FDEL`/`ADFT`/静态参考数据),航班类写 Redis 投影,未落到航班当前态的字段写 `UNMAPPED_FIELD`。 |
|
||||
| `delivery` | 读待发事件投 Kafka:按 `FLID` 保序、`schd` 聚合、失败重试(`US-08`;`C-29`)。 |
|
||||
| `delivery` | 读待发事件投 Kafka:按 `FLID` 保序、`schd` 聚合、失败重试(`US-08`;`C-9`)。 |
|
||||
| `jobs` | 回填扫描、出站请求重试、航班历史清理,以及 `PROC_STATE`、`MSG_EVENT`、`SCHD_SNAP_LOG`、`REQ_TRACK` 的到期清理;单独线程、不进 FIFO(与主泵的协作见 `US-14` AC4)。 |
|
||||
| `domain` / `config` | 领域状态、事件和决策模型,以及运行参数。 |
|
||||
| `infra` | 仓储(JDBC/stub)、外部适配器(共享信箱、Kafka、Redis、航班历史存储、AODB 出站)、重试、健康检查与日志;对其他模块只暴露接口。 |
|
||||
@@ -63,10 +63,10 @@ delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 /
|
||||
|
||||
航班动态消息走满全链,其余类别只换其中几步:
|
||||
|
||||
1. **收报**:按「处理时间为空」发现信箱行,登记入队(`INV-2b`)。
|
||||
1. **收报**:按「处理时间为空」发现信箱行,登记入队(`INV-1`)。
|
||||
2. **主泵**:按最小未完成 `MSG_ID` 取队头,解码,按业务身份去重(`US-03` AC1;implementation「消息、身份与决策」);非法或不支持的报文无副作用,终态留档(`US-03`)。
|
||||
3. **事务一**:持 `PIPELINE_LOCK`,领域变更、未映射字段记录与待发事件一起提交。
|
||||
4. **投影**:写 Redis,写成功才算处理完成(`INV-23`);失败保持未完成、下轮重写投影,业务效果幂等(`US-03` AC3)。
|
||||
4. **投影**:写 Redis,写成功才算处理完成(`INV-10`);失败保持未完成、下轮重写投影,业务效果幂等(`US-03` AC3)。
|
||||
5. **事务二**:处理终态与回填意图一起提交。
|
||||
6. **回填**:作业把处理标记写回共享信箱(`US-10`);写不上的记录在案并告警。
|
||||
7. **投递**:读待发事件发 `KAFKA:msg` / `KAFKA:schd`,至少一次(`C-9`);一直失败的记录保留可查并告警(`US-08`)。
|
||||
@@ -86,14 +86,14 @@ delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 /
|
||||
|
||||
以下约束不得违反:
|
||||
|
||||
- 只跑一个实例;主泵写航班当前态,历史清理作物理删除;正在被消息处理的航班清理时跳过(`OPS-1`、`PRE-5`、`US-14` AC4)。
|
||||
- 按顺序处理、只处理一次:每次只取编号最小的未完成消息(`US-03` AC1),重复扫描、失败重处理与兼容入口并发都只登记一次、生效一次(`INV-2b`);不丢消息依赖「编号即到达顺序」且编号不复用、不回退(`PRE-2`、`PRE-3`)。
|
||||
- Redis 写成功才算处理完成;查询接口与网页客户端读同一份 Redis,出问题时报错,不返回空列表假装正常(`INV-23`、`INV-24`;`US-05`、`US-06`、`US-12`)。
|
||||
- 日计划快照以 AODB 下发为准:快照里没有的航班删除,未携带的字段清除;增量报文按携带字段更新、未携带的不清空(`INV-15b`;`US-07`;`US-04` AC2)。
|
||||
- 只跑一个实例;主泵写航班当前态,历史清理作物理删除;正在被消息处理的航班清理时跳过(`OPS-1`、`US-14` AC4)。
|
||||
- 按顺序处理、只处理一次:每次只取编号最小的未完成消息(`US-03` AC1),重复扫描、失败重处理与兼容入口并发都只登记一次、生效一次(`INV-1`);不丢消息依赖「编号即到达顺序」且编号不复用、不回退(`Q7`)。
|
||||
- Redis 写成功才算处理完成;查询接口与网页客户端读同一份 Redis,出问题时报错,不返回空列表假装正常(`INV-10`、`INV-11`;`US-05`、`US-06`、`US-12`)。
|
||||
- 日计划快照以 AODB 下发为准:快照里没有的航班删除,未携带的字段清除;增量报文按携带字段更新、未携带的不清空(`INV-7`;`US-07`;`US-04` AC2)。
|
||||
- 对外投递至少一次,跨航班不承诺顺序(`C-9`;`US-08`)。
|
||||
- 航班只在历史写入成功后删除,历史库还没接通时一条也不删(`D1`;`US-14`)。
|
||||
- 静态参考数据一类校验失败只停这一类,其他类照常;空值是「当前没有值」,不是删除(`US-13`)。
|
||||
- 航班唯一:`FLID` 唯一(`INV-12`)。
|
||||
- 航班唯一:`FLID` 唯一(`INV-6`)。
|
||||
|
||||
这些约束是拿速度换来的:单活动主泵一次只推进一条,前一条没处理完,后面都得等。要提速、要多实例,光加线程没有用——得先重新设计消息顺序和数据由谁写,多实例还得补上可靠的互斥保护。
|
||||
|
||||
@@ -101,14 +101,14 @@ delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 /
|
||||
|
||||
| 存储 | 承载内容 | 职责说明 |
|
||||
|---|---|---|
|
||||
| 自有 PostgreSQL | 处理锁 `PIPELINE_LOCK`、消息处理状态与回填意图 `PROC_STATE`、待发事件 `MSG_EVENT`、出站请求跟踪 `REQ_TRACK`、航班当前态 `FLIGHT_SCHD`、资源明细表、`FLIGHT_ROUTE_POINT`、未映射字段长期记录表 `UNMAPPED_FIELD`、静态参考数据 `REF_MASTER`、日计划快照留痕 `SCHD_SNAP_LOG` | 本系统唯一的业务数据库,也是航班当前态的唯一权威(`INV-11b`);本地事务只发生在这里,事务怎么分段见「主流程」。`UNMAPPED_FIELD` 不随 `PROC_STATE` 到期清理。 |
|
||||
| Redis | 航班查询投影 | 只作查询,不是权威,也不存处理状态(`INV-11b`);只由本系统写入和移除(`INV-24`),内容来自 PG 当前态;`GET /all/flights` 与网页客户端读的就是它。 |
|
||||
| 共享 MySQL | `CMINMSGS` 入站信箱、`COUTMSGS` 出站信箱 | 信箱归外部系统所有。本系统只读写消息、回写处理标记,不建表、不改表结构、不清数据、不写历史表(`C-2`);原文保留与清除见 `C-1`(`Q9`)。出站请求写进去就算交付(`C-4`)。 |
|
||||
| 自有 PostgreSQL | 处理锁 `PIPELINE_LOCK`、消息处理状态与回填意图 `PROC_STATE`、待发事件 `MSG_EVENT`、出站请求跟踪 `REQ_TRACK`、航班当前态 `FLIGHT_SCHD`、资源明细表、`FLIGHT_ROUTE_POINT`、未映射字段长期记录表 `UNMAPPED_FIELD`、静态参考数据表组(admin-api 实体对齐,`Q22`)、日计划快照留痕 `SCHD_SNAP_LOG` | 本系统唯一的业务数据库,也是航班当前态的唯一权威(`INV-5`);本地事务只发生在这里,事务怎么分段见「主流程」。`UNMAPPED_FIELD` 不随 `PROC_STATE` 到期清理。 |
|
||||
| Redis | 航班查询投影 | 只作查询,不是权威,也不存处理状态(`INV-5`);只由本系统写入和移除(`INV-11`),内容来自 PG 当前态;`GET /all/flights` 与网页客户端读的就是它。 |
|
||||
| 共享 MySQL | `CMINMSGS` 入站信箱、`COUTMSGS` 出站信箱 | 信箱归外部系统所有。本系统只读写消息、回写处理标记,不建表、不改表结构、不写历史表(`C-2`);已回填的入站行按保留期自清(`C-1`、`Q9`)。出站请求写进去就算交付(`C-4`)。 |
|
||||
| 航班历史存储(Elasticsearch) | 已结束航班的历史副本 | 已结束航班写入这里作历史副本;写入确认成功后才删实时数据,写不成一条也不删(`D1`、`US-14` AC3)。保留期与容量上限未定(`G-FLIGHT-HIST-RETENTION`)。 |
|
||||
|
||||
**PG 的事务只管自己库。** Redis 写没写成、信箱标记写没写上、Kafka 发没发出,PG 事务都管不着;这些步骤各自可重试,重做多少遍结果都一样,重启后从 PG 记录接着走。
|
||||
|
||||
对外投递只承诺至少一次(`C-29`):应用重启、待发事件重发都可能让同一条消息多发一次,Kafka 的生产端幂等挡不住这种重复。
|
||||
对外投递只承诺至少一次(`C-9`):应用重启、待发事件重发都可能让同一条消息多发一次,Kafka 的生产端幂等挡不住这种重复。
|
||||
|
||||
## 7. 关键决策
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ AODB 经 CIIMS adapter 把 XML 报文写入 `CMINMSGS`,格式以架构指定
|
||||
|
||||
| 环节 | 已确定的边界 | 尚需确定 |
|
||||
|---|---|---|
|
||||
| 出站请求 | 本系统只发 `RQRD` 参考数据请求与 `RQFD` 日计划请求,经 `COUTMSGS` 落信,交付承诺止于落信(`US-09`;架构「系统定位与范围」「主流程」)。 | 报文类型与子类型清单、发送方取值、时间与序号的构造规则。 |
|
||||
| 出站请求 | 本系统只发 `RQRD` 参考数据请求与 `RQFD` 日计划请求,经 `COUTMSGS` 落信,交付承诺止于落信(`US-09`;架构「系统定位与范围」「主流程」)。编码规则已定(`C-4`)。 | 超时的时限取值。 |
|
||||
| 在途与作废 | `RQRD` 与 `RQFD` 各自同时最多一条已落信、未结案的请求;同一子类型发新请求时旧请求作废,新请求登记为待发送,等该报文类型的在途请求收到应答、失败或超时后再落信;请求超过时限未等到应答标记超时(`US-09`)。 | 超时的时限取值。 |
|
||||
| 应答匹配 | 应答按报文类型对应到等待中的请求;AODB 发错或迟到的应答不更新数据,记录后跳过(`US-09`);`SCHD-RESP` 只在请求未过期时生效,迟到的应答不更新数据(`US-07`)。 | 请求与应答的对应字段、过期判定的依据字段。 |
|
||||
| 错误回报 | 收到 `EROR` 时定位到本系统发出的请求,标记失败并告警(`US-09`)。 | `EROR` 与请求的对应字段。 |
|
||||
@@ -54,7 +54,7 @@ AODB 经 CIIMS adapter 把 XML 报文写入 `CMINMSGS`,格式以架构指定
|
||||
|
||||
跨航班顺序不构成契约。
|
||||
|
||||
测试环境与生产隔离的前提见 [specification.md](../specification.md) 的 `PRE-9`(`OPS-3`)。
|
||||
测试环境与生产隔离的前提见 [specification.md](../specification.md) 的 `PRE-1`(`OPS-3`)。
|
||||
|
||||
## 存储读写边界
|
||||
|
||||
@@ -62,7 +62,7 @@ AODB 经 CIIMS adapter 把 XML 报文写入 `CMINMSGS`,格式以架构指定
|
||||
|
||||
| 表 | 本系统的操作 | 需要对接方提供的物理契约 |
|
||||
|---|---|---|
|
||||
| `CMINMSGS` | 按信箱编号升序、分批读取未处理的报文,扫描与回写用同一处理时间列;兼容 HTTP 入口写入 XML 原文;处理完成后写入处理完成时刻,只填空值、不覆盖已有值;写回失败由后台任务重试,一直写不上的记录保留在案并告警(`US-01`、`US-02`、`US-10`)。 | 表 DDL、信箱编号与报文原文字段、处理时间列的列名、类型与可空性及写入样例(处理标记即该处理时间列,见 [specification.md](../specification.md) 的 `C-5`)、写入必需列、原文保留期和索引;信箱编号按到达顺序单调递增、不复用、不回退的保证(架构「必须保持的约束」)。 |
|
||||
| `CMINMSGS` | 按信箱编号升序、分批读取未处理的报文,扫描与回写用同一处理时间列;兼容 HTTP 入口写入 XML 原文;处理完成后写入处理完成时刻,只填空值、不覆盖已有值;写回失败由后台任务重试,一直写不上的记录保留在案并告警(`US-01`、`US-02`、`US-10`)。 | 表 DDL、信箱编号与报文原文字段、处理时间列的列名、类型与可空性及写入样例(处理标记即该处理时间列,见 [specification.md](../specification.md)「术语」的处理标记;回填只填空值)、写入必需列、原文保留期和索引;信箱编号按到达顺序单调递增、不复用、不回退的保证(架构「必须保持的约束」)。 |
|
||||
| `COUTMSGS` | 写入 `RQRD` 参考数据请求与 `RQFD` 日计划请求;CIIMS adapter 消费。交付承诺止于请求落信;写入结果不明时记录并告警,不直接重发(架构「主流程」)。 | 表 DDL、请求原文字段、写入必需列、编号生成方式、重复落信的识别规则。 |
|
||||
|
||||
共享 MySQL 归 CIIMS adapter 方所有;本系统不建表、不改表结构、不清除数据,也不写共享历史表。外部表的物理字段必须以对接方提供的现行 DDL 与读写样例核对,不能由本文件推造。
|
||||
@@ -84,14 +84,14 @@ AODB 经 CIIMS adapter 把 XML 报文写入 `CMINMSGS`,格式以架构指定
|
||||
|
||||
- 投影是 hash `flightInfo`:field 为 `FLID`,value 为完整 `SCHD.FLTR` 对象的带类型 JSON,不设过期;Redis 里没有名为 `schd` 的 key,`schd` 只是 Kafka 主题。
|
||||
- 写入路径:日计划下载(`DNLD`/`RESP`)整体写入当天航班,单条变更(`ADFT`、`FLOP`)只写对应的一条,转历史时按 `FLID` 逐条移除。整体写入不删除本次映射中缺席的航班,与 `US-07` AC5 相反,新版按 `US-07` AC5 刷新。
|
||||
- 写入前生成主航班的共享航班列表 `MAFL`(`G-MAFL`)并拼出登机桥字段 `abdg`,两者是否为网页客户端所需仍未定(`Q6`)。
|
||||
- 写入前生成主航班的共享航班列表 `MAFL`(`G-MAFL`),是否为网页客户端所需仍未定(`Q6`);登机桥字段 `abdg` 本版不提供——旧系统拼它的数据源是机位与登机桥映射缓存,已列入需求「范围与非目标」不交付。
|
||||
- 旧系统 Redis 另有两条机位基础数据缓存,都由本系统调用 admin-api 填充、过期 3600 秒:`orms_stand`(field 为机位代码,value 为 `OrmsStand` 对象的带类型 JSON);`orms_stand_airbridge`(field 为机位代码,value 为登机桥代码数组的 JSON 字符串,不是对象)。这两条是旧系统按计划机位拼 `abdg` 的数据来源,本版不交付(需求「范围与非目标」)。
|
||||
|
||||
### 自有 PostgreSQL:内部存储与 admin-api 只读
|
||||
|
||||
| 表或表组 | 边界 | 尚需确定的字段级契约 |
|
||||
|---|---|---|
|
||||
| `REF_MASTER` | 静态参考数据与资源状态按类别、编号保存在独立数据表,admin-api 直接只读;新消息覆盖旧记录,全量消息整体替换,增删改消息逐条处理(`US-13`);一类校验不通过只停这一类、其他类照常,校验失败类别的已有记录不变;字段为空表示「当前没有值」,不是删除(架构「必须保持的约束」)。 | 类别和编号的物理列、各类别字段及类型、主键/唯一键、空值在列中怎样保存、写入后何时可读。类别范围与消息中的识别标签见下表。 |
|
||||
| 静态参考数据表组 | 静态参考数据与资源状态保存在独立数据表组,表与列直接取 admin-api 实体注解,不改名、不合并,admin-api 直接只读;新消息覆盖旧记录,全量消息整体替换,增删改消息逐条处理(`US-13`);一类校验不通过只停这一类、其他类照常,校验失败类别的已有记录不变;字段为空表示「当前没有值」,不是删除(架构「必须保持的约束」)。 | 13 类报文与资源状态到表组的映射(`Q22`);admin-api 需要哪些字段。类别码与消息中的识别标签见下表。 |
|
||||
| `FLIGHT_SCHD`、资源明细表、`FLIGHT_ROUTE_POINT` | 航班当前态的唯一权威;`FLID` 唯一(架构「必须保持的约束」);Redis 和 Kafka 从处理结果派生,不反向覆盖这些表。 | 主键、字段与类型、资源明细表清单、外键/索引与迁移 DDL。 |
|
||||
| `PROC_STATE`、`MSG_EVENT`、`REQ_TRACK`、`SCHD_SNAP_LOG`、`PIPELINE_LOCK`、`UNMAPPED_FIELD` | 管道处理、待发事件、请求跟踪、留痕、互斥及未映射字段由本系统维护;不对外提供直接读写接口。 | 字段、约束、索引与迁移 DDL 由内部实现设计确定;若其他系统需读取,须另立读取契约。 |
|
||||
|
||||
@@ -126,7 +126,7 @@ AODB 经 CIIMS adapter 把 XML 报文写入 `CMINMSGS`,格式以架构指定
|
||||
| 写入对象 | 满足 `US-14` 已结束判据的航班从自有业务数据库写入 Elasticsearch 历史库,作为历史查询副本。 | 历史索引名称、文档 ID、写入字段及类型、嵌套资源结构、字段缺失与删除状态的表达方式、索引保留期与容量上限(架构「数据归属与一致性」列为未定)。 |
|
||||
| 成功确认 | 只有该航班的历史写入成功,才允许从实时数据物理删除;删除前按 `D1` 必要时登记待发删除事件。 | Elasticsearch 写入响应中何种结果算成功、成功是否要求可查询、批量响应如何逐项确认。 |
|
||||
| 写入粒度 | 单个航班写入失败不影响其他航班。 | 使用逐条请求还是批量请求、批量大小、部分成功时的确认与继续处理规则。 |
|
||||
| 失败与重试 | 写入失败的航班保持在实时数据中,下次运行再试;已写入的航班不重复写入;正在被消息处理的航班跳过,下轮再处理。 | 超时或响应不明时的对账方式、可重试错误分类、重试间隔、文档 ID 和覆盖策略如何保证幂等。 |
|
||||
| 失败与重试 | 写入失败的航班保持在实时数据中,下次运行再试;已写入的航班不重复写入;正在被消息处理的航班跳过,下轮再处理。文档 ID 按旧系统线索为 `SODT + FLID` 幂等 upsert,写入结果不明时重试同一写入。 | 可重试错误分类、重试间隔。 |
|
||||
|
||||
旧系统线索:逐航班按 `SODT + FLID` 查询旧索引 `flight_hts`,存在则更新、不存在则新增;写入内容是 `SCHD.FLTR` 序列化后的 JSON,单条写入失败跳过该航班(旧项目用户故事「动态航班转历史」)。
|
||||
|
||||
|
||||
+35
-35
@@ -14,10 +14,10 @@
|
||||
|
||||
| 术语 | 语义 |
|
||||
|---|---|
|
||||
| 扫描谓词 | 信箱读取条件「处理时间为空」(`INV-2b`);本系统不以 ID 区间或水位作为消费边界。 |
|
||||
| 扫描谓词 | 信箱读取条件「处理时间为空」(`INV-1`);本系统不以 ID 区间或水位作为消费边界。 |
|
||||
| 队头 | 最小的未完成消息(`PENDING` 与 `FAILED` 都占位)。 |
|
||||
| 终态 | `SUCCEEDED` / `SKIPPED` / `DEAD`;到达后队列方可推进。 |
|
||||
| 回填意图 | 「还欠一次信箱标记」的持久化事实,与终态同一条语句落库,且发生在 Redis 投影写成功之后(`INV-23`)。 |
|
||||
| 回填意图 | 「还欠一次信箱标记」的持久化事实,与终态同一条语句落库,且发生在 Redis 投影写成功之后(`INV-10`)。 |
|
||||
| `R`、`R_keep`、处理标记 | 定义见 [specification.md](specification.md)。 |
|
||||
|
||||
### 1.2 持久化记录
|
||||
@@ -25,7 +25,7 @@
|
||||
| 记录 | 用途 | 关键约束 |
|
||||
|---|---|---|
|
||||
| `PROC_STATE` | 入站消息的处理状态、身份、尝试次数、错误原因与回填事实 | `MSG_ID = CMINMSGS_ID` 主键防重复入队;`IDENTITY_KEY` 唯一约束防业务重复;按最小未完成 `MSG_ID` 取队头;`BACKFILL_NEXT_AT` 非空 = 还欠一次回填,`BACKFILL_AT` 非空 = 标记已确认,`BACKFILL_ABANDONED_AT/REASON` 非空 = 已停止自动重试(**不等于**标记已确认);`RECEIVED_AT` 复制自信箱接收时间、**可能为 NULL**、仅用于对账与展示;`ENQUEUED_AT` 是本地入队时间、非空、是超期判据的唯一依据。 |
|
||||
| `MSG_EVENT` | 等待投递的事件(outbox) | `EVENT_ID` 对 `KAFKA:msg` 是稳定事件身份并决定投递顺序;对 `KAFKA:schd` 是每次接受 upsert 时替换的写代次。`TARGET` 区分 `KAFKA:msg` / `KAFKA:schd`;`PARTITION_KEY` 当前取 `FLID`(`Q4` 定案前为假定,见 `C-29`);`EVENT_TYPE` 区分 UPSERT 与 TOMBSTONE。`KAFKA:schd` 按 `FLID` 单行 upsert,只保留最新 `STATE_VERSION`;`SENT_AT` 在投递确认的同一条 UPDATE 内写入,是保留期判定的唯一基准。 |
|
||||
| `MSG_EVENT` | 等待投递的事件(outbox) | `EVENT_ID` 对 `KAFKA:msg` 是稳定事件身份并决定投递顺序;对 `KAFKA:schd` 是每次接受 upsert 时替换的写代次。`TARGET` 区分 `KAFKA:msg` / `KAFKA:schd`;`PARTITION_KEY` 当前取 `FLID`,`msg` 单分区下不参与路由(`CLM-3`);`EVENT_TYPE` 区分 UPSERT 与 TOMBSTONE。`KAFKA:schd` 按 `FLID` 单行 upsert,只保留最新 `STATE_VERSION`;`SENT_AT` 在投递确认的同一条 UPDATE 内写入,是保留期判定的唯一基准。 |
|
||||
| `REQ_TRACK` | 上游请求及应答关联 | 状态 `PENDING / SENT / DONE / EXPIRED`;保存请求类型、覆盖运营日、发送方、出站信箱 ID 与发送/完成时间;**「同类只允许一个开放请求」的唯一键 = `(请求类型, 覆盖运营日, 发送方)`,且仅对开放状态生效**。 |
|
||||
| `REF_MASTER` | SIS 消息提供的静态参考数据与资源状态(目标表) | `(RTYPE, RKEY)` 唯一;`RTYPE` 类别、合并语义与资源状态见「静态参考数据」;取数路径见 [requirements.md](requirements.md) `US-13`。 |
|
||||
| `FLIGHT_SCHD` | 航班标量及单值异常字段 | `FLID` 主键;运营日与版本、最近消息 ID 用于追踪。变长集合存于资源明细表与 `FLIGHT_ROUTE_POINT`,规则见「航班域」。 |
|
||||
@@ -37,11 +37,11 @@
|
||||
|
||||
`XmlCodec`(实装 `JacksonXmlCodec`)把 XML 解码为 `DecodedMessage`,包含 `SNDR / TYPE / STYP / SEQN / DTTM` 元数据、`MsgKind` 与业务载荷。解码失败区分 `MALFORMED`(报文非法,不重试)与可随 codec 修复的 `CODEC_ERROR`。`MsgKind` 是一等分派键:`Schd(RESP/DNLD/ADFT)`、`Flop`、`Fdel`、`Unsupported`。
|
||||
|
||||
业务身份统一由 `Identity.of` 生成:`SNDR | TYPE | STYP | SEQN`。接收时只按信箱 ID 去重,解码后才首次绑定业务身份;重试保留原有绑定,因此自身重试不会被判为重复。身份被另一条记录占用时,当前消息转 `SKIPPED`,记录 `duplicate-of:<id>`。是否加入日期边界取决于上游 `SEQN` 重置周期(见 `C-20`/`Q11` 与 `PARAM:msgx.identity.include-day-boundary`);上线后不能随意更换身份算法。
|
||||
业务身份统一由 `Identity.of` 生成:`SNDR | TYPE | STYP | SEQN`。接收时只按信箱 ID 去重,解码后才首次绑定业务身份;重试保留原有绑定,因此自身重试不会被判为重复。身份被另一条记录占用时,当前消息转 `SKIPPED`,记录 `duplicate-of:<id>`。是否加入日期边界取决于上游 `SEQN` 重置周期(见 `C-3`/`Q10` 与 `PARAM:msgx.identity.include-day-boundary`);上线后不能随意更换身份算法。
|
||||
|
||||
**身份绑定是独立的幂等单语句**(`WHERE IDENTITY_KEY IS NULL`),不参与业务事务。它的前提是「报文不可变」(`PRE-7`):同一身份的重发不会被比对内容,若上游改发正文会被判为重复并跳过(`Q15`)。
|
||||
**身份绑定是独立的幂等单语句**(`WHERE IDENTITY_KEY IS NULL`),不参与业务事务。它的前提是「报文不可变」(`Q4`):同一身份的重发不会被比对内容,若上游改发正文会被判为重复并跳过(`Q4`)。
|
||||
|
||||
分派与落库由 `MessageProcessor` 协调:按 `MsgKind` 把已绑定身份的队头消息交给对应事务协调器(SCHD-DNLD/RESP → `ScheduleProcessor`,ADFT → `AdftProcessor`,FLOP → `FlopProcessor`,FDEL → `FdelProcessor`,`SIS:3.1`~`SIS:3.14` 的静态参考数据消息 → `ReferenceDataProcessor`,其余 → `SKIPPED(unsupported)`)。这些处理器在 `PIPELINE_LOCK` 事务内读取当前完整态,调用纯领域决策逻辑得到下一完整态与待发事件,提交该事务后写 Redis 投影,再在另一事务中登记处理终态与回填意图(`INV-3`、`INV-23`);它们不直接触碰 Kafka。领域决策逻辑不执行 I/O。处理步骤的锁跨越 Redis 写,使与航班历史清理的协作覆盖整个步骤(`US-14` AC4)。
|
||||
分派与落库由 `MessageProcessor` 协调:按 `MsgKind` 把已绑定身份的队头消息交给对应事务协调器(SCHD-DNLD/RESP → `ScheduleProcessor`,ADFT → `AdftProcessor`,FLOP → `FlopProcessor`,FDEL → `FdelProcessor`,`SIS:3.1`~`SIS:3.14` 的静态参考数据消息 → `ReferenceDataProcessor`,其余 → `SKIPPED(unsupported)`)。这些处理器在 `PIPELINE_LOCK` 事务内读取当前完整态,调用纯领域决策逻辑得到下一完整态与待发事件,提交该事务后写 Redis 投影,再在另一事务中登记处理终态与回填意图(`INV-3`、`INV-10`);它们不直接触碰 Kafka。领域决策逻辑不执行 I/O。处理步骤的锁跨越 Redis 写,使与航班历史清理的协作覆盖整个步骤(`US-14` AC4)。
|
||||
|
||||
合法但本系统不支持的消息类型:跳过留档、按已处理写回标记(`US-03` AC2),不重试。`REGN` / `RSTA` 是静态参考数据消息,必须分派给 `US-13`,不得跳过。
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
### 4.1 收报流程
|
||||
|
||||
`InboxPoller` 按配置周期查信箱中「处理时间为空」的行,按编号升序、每批有上限,在自有 PG 登记 `PENDING`(`INV-2b`)。每轮:
|
||||
`InboxPoller` 按配置周期查信箱中「处理时间为空」的行,按编号升序、每批有上限,在自有 PG 登记 `PENDING`(`INV-1`)。每轮:
|
||||
|
||||
1. 信箱不可读时记日志、等下一轮——这是基础设施失败,不能当成「没有新消息」。
|
||||
2. 取「处理时间为空」的行的升序前 `PARAM:msgx.pipeline.claim-batch` 条。
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
### 4.2 顺序依据
|
||||
|
||||
编号即到达顺序的前提见 `PRE-2`/`PRE-3`(`C-30`/`C-3`):ID 按提交顺序分配、空间不复位不复用。较小编号迟提交的最坏结果是被发现得晚(下一轮扫描仍会读到),不会丢。
|
||||
编号即到达顺序的前提已定案(`Q7`):ID 按提交顺序分配、空间不复位不复用。较小编号迟提交的最坏结果是被发现得晚(下一轮扫描仍会读到),不会丢。
|
||||
|
||||
### 4.3 兼容 HTTP 入口
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
|
||||
### 4.4 单实例
|
||||
|
||||
信箱读取不加锁,本设计只在单活动实例下成立(`PRE-5`)。多实例并发扫描会重复登记同一行,主键幂等兜底不会丢消息,但实例级排他仍是前提。
|
||||
信箱读取不加锁,本设计只在单活动实例下成立(`OPS-1`)。多实例并发扫描会重复登记同一行,主键幂等兜底不会丢消息,但实例级排他仍是前提。
|
||||
|
||||
## 5. 主泵调度与单条处理
|
||||
|
||||
@@ -121,7 +121,7 @@ processOne(head):
|
||||
Unsupported → SKIPPED(unsupported)(跳过留档,按已处理写回标记)
|
||||
载荷缺失 → DEAD(MALFORMED)
|
||||
整包协议拒绝 → DEAD(PROTOCOL),不落半包
|
||||
5. 业务型成功,分三步(INV-17b、INV-23):
|
||||
5. 业务型成功,分三步(INV-3、INV-10):
|
||||
① 事务提交:航班变更 + 待发事件
|
||||
② 写 Redis 投影;失败 → 保持未完成,下轮重处理
|
||||
③ 事务提交:SUCCEEDED + 回填意图
|
||||
@@ -137,15 +137,15 @@ processOne(head):
|
||||
|---|---|---|---|---|
|
||||
| 收报入队(`insertIfAbsent`) | 是 | 否 | 否 | 同库事务 |
|
||||
| 身份首次绑定 | 否 | 否 | 否 | 单语句 + 唯一约束 |
|
||||
| 业务型领域变更(航班变更 + 待发事件) | 是 | 是 | 是 | 同库事务(`INV-17b`) |
|
||||
| Redis 投影写 | 否 | 是(处理步骤锁跨越本步) | 否 | 外部副作用,不在 PG 事务内;写成功是终态事务的前置(`INV-23`) |
|
||||
| 业务型终态(`SUCCEEDED` + 回填意图) | 是 | 是 | 否 | 同库事务(`INV-17b`) |
|
||||
| 业务型领域变更(航班变更 + 待发事件) | 是 | 是 | 是 | 同库事务(`INV-3`) |
|
||||
| Redis 投影写 | 否 | 是(处理步骤锁跨越本步) | 否 | 外部副作用,不在 PG 事务内;写成功是终态事务的前置(`INV-10`) |
|
||||
| 业务型终态(`SUCCEEDED` + 回填意图) | 是 | 是 | 否 | 同库事务(`INV-3`) |
|
||||
| 非业务型终态(`MALFORMED` / `PROTOCOL` / `SKIPPED` / `EXHAUSTED`) | 否 | 否 | 否 | 单语句(终态与回填意图同一条 UPDATE) |
|
||||
| 航班历史清理的物理删除 | 是 | 是(落实 `US-14` AC4) | 是 | 同库事务:复查判据 + 历史写入成功后删除 |
|
||||
| 回填(信箱标记 + `BACKFILL_AT`) | 否 | 否 | 否 | 跨库两次单写;幂等可重跑 |
|
||||
| 人工重放(批量改回 `PENDING`) | 否 | 否 | 否 | 单语句批量;`MessageLifecycleGate` 与回填互斥 |
|
||||
|
||||
结论:航班变更与处理终态**不在同一事务**——两者之间夹着 Redis 投影写;同一事务只保证「航班变更 + 事件」与「终态 + 回填意图」各自原子(`INV-3`、`INV-23`)。处理步骤的 `PIPELINE_LOCK` 跨越 Redis 写,使与航班历史清理的协作覆盖整个步骤(`US-14` AC4);该锁的竞争写者是**航班历史清理**,不是别的处理器线程;没有第二写者时该锁不产生额外串行度。
|
||||
结论:航班变更与处理终态**不在同一事务**——两者之间夹着 Redis 投影写;同一事务只保证「航班变更 + 事件」与「终态 + 回填意图」各自原子(`INV-3`、`INV-10`)。处理步骤的 `PIPELINE_LOCK` 跨越 Redis 写,使与航班历史清理的协作覆盖整个步骤(`US-14` AC4);该锁的竞争写者是**航班历史清理**,不是别的处理器线程;没有第二写者时该锁不产生额外串行度。
|
||||
|
||||
### 5.4 历史积压
|
||||
|
||||
@@ -155,7 +155,7 @@ processOne(head):
|
||||
- 不加速、不分流、不走旁路:不允许并行队头,也不允许实时消息跳过积压。
|
||||
- 尝试上限与退避对积压同样生效,不因积压而放宽。
|
||||
- 不再处理的行置 `SKIPPED` 并记录原因,到达终态后走回填通道;不存在「整段 DELETE」的快速通道。
|
||||
- 消化期间的可观测项见 [reference.md](reference.md);完成时限不作对外承诺(`CLM-9`),现场一般为即时处理。
|
||||
- 消化期间的可观测项见 [reference.md](reference.md);完成时限不作对外承诺(`CLM-5`),现场一般为即时处理。
|
||||
|
||||
## 6. 回填
|
||||
|
||||
@@ -174,7 +174,7 @@ ORDER BY BACKFILL_ATTEMPTS ASC, MSG_ID ASC -- 公平轮转,永久失败
|
||||
LIMIT PARAM:msgx.pipeline.backfill-batch
|
||||
```
|
||||
|
||||
超期判据使用**本地入队时间**(`ENQUEUED_AT`),不使用信箱的 `RECEIVED_AT`:后者来自外部时钟,前偏会在「打标即清除」语义下造成提前清除(`PRE-4`)。
|
||||
超期判据使用**本地入队时间**(`ENQUEUED_AT`),不使用信箱的 `RECEIVED_AT`:后者来自外部时钟,前偏会在「打标即清除」语义下造成提前清除。
|
||||
|
||||
### 6.2 四种结果与放弃
|
||||
|
||||
@@ -215,7 +215,7 @@ LIMIT PARAM:msgx.pipeline.backfill-batch
|
||||
|
||||
1. **重复处理判定**:`PROC_STATE` 已存在成功终态 → 幂等成功,仅追加留痕,不重复写入。
|
||||
2. **整包校验**:声明记录数、航班标识与运营日推导等校验失败 → 整包 `DEAD(PROTOCOL)`,不写半包,既有状态保持不变。
|
||||
3. **分批写入**:锁内按 `FLID` 点查归属日,发现同一航班跨运营日即整包回滚并 `DEAD(PROTOCOL)`;通过后分批合并写主表与资源明细,每批一个事务(状态变更 + 待发事件,`INV-17b`)。快照里没有的航班删除:标记已删除、登记删除事件、从 Redis 投影移除(`INV-15b`)。
|
||||
3. **分批写入**:锁内按 `FLID` 点查归属日,发现同一航班跨运营日即整包回滚并 `DEAD(PROTOCOL)`;通过后分批合并写主表与资源明细,每批一个事务(状态变更 + 待发事件,`INV-3`)。快照里没有的航班删除:标记已删除、登记删除事件、从 Redis 投影移除(`INV-7`)。
|
||||
4. **提交结果**:整包完成后在同一事务置消息 `SUCCEEDED` 并预登记回填意图;提交后信箱回填由扫描承接,留痕在事务外追加。处理失败不标记已处理,下轮整包重新处理。
|
||||
|
||||
字段缺失与清空语义、运营日规则见「航班域」。
|
||||
@@ -232,10 +232,10 @@ PENDING → SENT → DONE
|
||||
```
|
||||
|
||||
- 注册同类新请求前使旧开放请求过期;只有 `COUTMSGS` 写入确认后才标记 `SENT` 并关联出站记录;写信箱成功但本地未确认的情况需要补偿与去重,不能无条件重新发送。
|
||||
- 应答优先按已确认的回显字段精确匹配;降级匹配的跨代误配风险必须明确接受并审计(`C-23`)。
|
||||
- 时间比较统一时区与单位,并需定义时钟偏斜容忍;容忍判据未定(`Q5`),在定义前不得把降级匹配描述为精确关联。
|
||||
- 应答按报文类型匹配等待中的开放请求(`US-09` AC2);降级匹配的跨代误配风险必须明确接受并审计。
|
||||
- 时间比较统一时区与单位,判据一律用本地时钟(入队、发送时间),不引入库方或对方时钟。
|
||||
- 参考应答写入自有 `REF_MASTER`,日计划应答走快照流程;请求完成必须在相应数据处理成功之后,超时和迟到应答不能修改已关闭请求对应的状态。
|
||||
- 出站承诺只到落信(`C-4`、`CLM-8`);主 / 共享删除见 `C-5`。
|
||||
- 出站承诺只到落信(`C-4`、`CLM-4`);主 / 共享删除见 `C-5`。
|
||||
|
||||
## 8. 事件投递
|
||||
|
||||
@@ -257,7 +257,7 @@ PENDING → SENT → DONE
|
||||
|
||||
`KAFKA:schd` 行的 `EVENT_ID` 不是跨代次稳定的事件句柄:每次接受更新都从全局序列取得新值并替换原主键,用作条件确认的写代次。重放和人工处置只能针对当前 `(TARGET, PARTITION_KEY, EVENT_ID)`;旧代次被替换后不再能按旧 ID 寻址。升级时若已有重复行,按 `STATE_VERSION DESC, EVENT_ID DESC` 保留一行,使迁移与运行时只进不退规则一致。
|
||||
|
||||
- **只进不退**:仅当新事件的 `STATE_VERSION ≥` 行内现有版本才覆盖,防止迟到的旧事件把新状态压回去。该合并规则以 `C-21`(`FLID` 在保留期内不复用)为前提。
|
||||
- **只进不退**:仅当新事件的 `STATE_VERSION ≥` 行内现有版本才覆盖,防止迟到的旧事件把新状态压回去。该合并规则以 `FLID` 在保留期内不复用(设计前提)为前提。
|
||||
- **条件标记**:发送成功后按**读取时刻的版本**做条件标记(`WHERE STATE_VERSION = <本批版本>`);该行若期间已被更新的版本覆盖,则不标记,留待下一轮重发。
|
||||
|
||||
发送时:
|
||||
@@ -303,7 +303,7 @@ PENDING → SENT → DONE
|
||||
**通则**(对本系统所有持久对象适用)
|
||||
|
||||
- **时间不构成清除依据**:到期只是必要条件,**终局证据才是充分条件**(航班见 `US-14` AC3、`D1`;共享库的清除依据属未确认的清除协议,见 `C-1` 与 `Q9`)。
|
||||
- **证据不随清除消失**:回填失败与放弃的记录在其覆盖的信箱行被清除前保持可查(`C-16`)。
|
||||
- **证据不随清除消失**:回填失败与放弃的记录在其覆盖的信箱行被清除前保持可查(`US-10` AC2)。
|
||||
- **证据缺失或结果不明时按最保守处置**:航班清理为删 0 条(`US-14` AC3、`D1`)。
|
||||
|
||||
**逐对象生命周期**(保留期取值一律见 [reference.md](reference.md))
|
||||
@@ -339,7 +339,7 @@ PENDING → SENT → DONE
|
||||
|
||||
## 10. 容量假设与设计取舍
|
||||
|
||||
本设计按以下量级选型(参数默认值的依据列见 [reference.md](reference.md),可声明性见 `CLM-10`):
|
||||
本设计按以下量级选型(参数默认值的依据列见 [reference.md](reference.md),可声明性见 `CLM-6`):
|
||||
|
||||
- 单机场、单活动实例、单维护者;入站日消息量千级到万级;单条报文量级 ≤ 10⁴ 字节。
|
||||
- 处理延迟秒级可接受;航班可见性延迟不劣于现役(轮询间隔 + 聚合周期秒级)。
|
||||
@@ -351,12 +351,12 @@ PENDING → SENT → DONE
|
||||
|
||||
本章是航班状态的唯一现行设计规范。其他各章只描述管道机制,不重复定义航班域规则。
|
||||
|
||||
系统从共享 MySQL 信箱接收 SIS/AODB 报文,把结果合并到自有 PostgreSQL 中的航班当前态并同步写 Redis 投影,再通过 outbox 投递 Kafka。共享信箱、Redis 投影和 Kafka 都不是状态权威;Redis 投影写在处理完成之前(`INV-23`)。
|
||||
系统从共享 MySQL 信箱接收 SIS/AODB 报文,把结果合并到自有 PostgreSQL 中的航班当前态并同步写 Redis 投影,再通过 outbox 投递 Kafka。共享信箱、Redis 投影和 Kafka 都不是状态权威;Redis 投影写在处理完成之前(`INV-10`)。
|
||||
|
||||
- `FLID` 是航班实例的唯一标识;不得由航班号、日期或资源号推断身份。
|
||||
- `FLIGHT_SCHD` 及其明细表是唯一权威当前态;Redis 投影与展示视图只读,不能作为写入或对账来源(`INV-11b`)。
|
||||
- `FLIGHT_SCHD` 及其明细表是唯一权威当前态;Redis 投影与展示视图只读,不能作为写入或对账来源(`INV-5`)。
|
||||
- 单活动主泵按信箱 FIFO 推进。事务内 `PIPELINE_LOCK` 只串行化本地状态提交,不替代选主或消息认领。
|
||||
- 状态变更与 outbox 事件在同一 PostgreSQL 事务中提交;处理终态与回填意图在同一事务中提交、且晚于 Redis 投影写成功(`INV-17b`);回填与 Kafka 投递在提交后独立重试。
|
||||
- 状态变更与 outbox 事件在同一 PostgreSQL 事务中提交;处理终态与回填意图在同一事务中提交、且晚于 Redis 投影写成功(`INV-3`);回填与 Kafka 投递在提交后独立重试。
|
||||
|
||||
### 11.1 权威模型
|
||||
|
||||
@@ -419,24 +419,24 @@ PENDING → SENT → DONE
|
||||
- 只有 `MAID` 为空的主航班携带 `MAFL`;共享航班只携带自身 `MAID`、`CSOP`、`CSFT`,不携带 `MAFL`,避免下游双向合并。
|
||||
- 同一写代次下投影逐字节稳定,与到达顺序及 `FLNO` 变更无关;重发与消费端比对才有意义。
|
||||
- `MAID = FLID` 的自引用行不进入任何 `MAFL`;`MAID` 指向不存在主航班的悬挂引用不阻断该子航班自身处理,只是不产生投影。
|
||||
- 子航班集合变化的传播见 `INV-22`,事件类型为 `KAFKA:msg` + `KAFKA:schd`;否则整态投影的只进不退写入会丢弃它(见「`schd` 聚合」)。共享航班自身不单独发通知。
|
||||
- 派生主航班投影与产生它的状态写入必须同一事务或一致读快照;按 `MAID` 取子航班要求该列有索引(`INV-17b`、`INV-22`)。
|
||||
- 子航班集合变化的传播见 `US-06` AC2,事件类型为 `KAFKA:msg` + `KAFKA:schd`;否则整态投影的只进不退写入会丢弃它(见「`schd` 聚合」)。共享航班自身不单独发通知。
|
||||
- 派生主航班投影与产生它的状态写入必须同一事务或一致读快照;按 `MAID` 取子航班要求该列有索引(`INV-3`、`US-06` AC2)。
|
||||
|
||||
## 12. 航班域:合并、删除与生命周期
|
||||
|
||||
本章的领域规则只描述「合并成什么态」;决策纯度、事务边界与落库职责见「消息、身份与决策」与 `INV-17b`(`US-03`)。
|
||||
本章的领域规则只描述「合并成什么态」;决策纯度、事务边界与落库职责见「消息、身份与决策」与 `INV-3`(`US-03`)。
|
||||
|
||||
### 12.1 SCHD 日计划
|
||||
|
||||
SCHD DNLD/RESP 在整包校验通过后,分批将报文携带的航班写入当前态,每批一个事务;快照里没有的航班删除:标记已删除、登记删除事件、从 Redis 投影移除(`INV-15b`)。日计划就是主动与 AODB 全量同步一次,以 AODB 下发的数据为准。
|
||||
SCHD DNLD/RESP 在整包校验通过后,分批将报文携带的航班写入当前态,每批一个事务;快照里没有的航班删除:标记已删除、登记删除事件、从 Redis 投影移除(`INV-7`)。日计划就是主动与 AODB 全量同步一次,以 AODB 下发的数据为准。
|
||||
|
||||
日计划里某航班没携带的字段,视为 AODB 已删除该值,本地同步清除(`C-26`)。每个成功写入的航班推进 `STATE_VERSION`,并在同一事务登记 `KAFKA:schd` 与 `KAFKA:msg` 事件。
|
||||
日计划里某航班没携带的字段,视为 AODB 已删除该值,本地同步清除(`C-6`)。每个成功写入的航班推进 `STATE_VERSION`,并在同一事务登记 `KAFKA:schd` 与 `KAFKA:msg` 事件。
|
||||
|
||||
消息重复处理由 `PROC_STATE` 的消息 ID 与 `IDENTITY_KEY` 控制;已成功提交的消息不得再次写入或重复登记事件。整包校验失败时整包不落地(`INV-4`);运营日冲突见 `Q23`。
|
||||
|
||||
### 12.2 动态运行事件(FLOP)
|
||||
|
||||
FLOP 只修改报文表达的字段或集合,其余状态保持不变;目标形态与合并规则见「字段与集合」。`STYP` 必须命中下表白名单,未知值按不支持类型跳过留档(`US-03` AC2),不得进入通用合并。已确认的动态更新在同一事务推进 `STATE_VERSION` 并登记 `KAFKA:msg` 与 `KAFKA:schd`(`INV-17b`);处理终态与回填意图在 Redis 投影写成功后的另一事务中提交(`INV-23`)。同一消息不产生两次效果见 `US-03`;逐类规则未补齐见 `G-FLOP-IDEMPOTENT`。
|
||||
FLOP 只修改报文表达的字段或集合,其余状态保持不变;目标形态与合并规则见「字段与集合」。`STYP` 必须命中下表白名单,未知值按不支持类型跳过留档(`US-03` AC2),不得进入通用合并。已确认的动态更新在同一事务推进 `STATE_VERSION` 并登记 `KAFKA:msg` 与 `KAFKA:schd`(`INV-3`);处理终态与回填意图在 Redis 投影写成功后的另一事务中提交(`INV-10`)。同一消息不产生两次效果见 `US-03`;逐类规则未补齐见 `G-FLOP-IDEMPOTENT`。
|
||||
|
||||
逐类语义以 SIS 的字段表、空标签规则与 Processing Exceptions 为准;下表每一行都必须有一条回归用例钉住「输入与前态 → 目标状态 → 终态与事件」。
|
||||
|
||||
@@ -487,7 +487,7 @@ ADFT 的字段缺失语义尚待上游确认。在确认前采用保守的 Set-o
|
||||
|
||||
主/共享航班级联:删除共享航班时重算主航班 `MAFL`(见「主/共享投影」)并向主航班通知;删除主航班时级联删除其子共享关联并发出删除通知;主/共享关系必须一次原子变更,不出现主已删、子残留的半状态。共享航班增量通常只更新并通知主航班,不直接发共享通知。这些语义同样约束 FDEL 之外的生命周期清理。主/共享关联的增删按 `FLID` 做值比较,不使用引用比较。
|
||||
|
||||
本章的原子级联不回发 EROR(`C-25`、`Q14` 已定案)。
|
||||
本章的原子级联不回发 EROR(`C-5`、`Q12` 已定案)。
|
||||
|
||||
### 12.4 Kafka 与读取
|
||||
|
||||
@@ -536,7 +536,7 @@ ADFT 的字段缺失语义尚待上游确认。在确认前采用保守的 Set-o
|
||||
|
||||
### 13.3 结构与合并语义
|
||||
|
||||
`REF_MASTER` 是对业务暴露的有效参考数据视图,逻辑身份为 `(RTYPE, RKEY)`;普通类别的 `RKEY` 见上表,`RSTA` 的身份必须同时包含 `RTYP` 与 `RSID`。记录保存消息来源、消息批次、刷新时间与按 SIS 标签名组织的字段载荷;重复字段保留输入顺序并表示为有序数组。参考数据保存在独立的数据表中,admin-api 直接读取(`C-31`)。
|
||||
`REF_MASTER` 是对业务暴露的有效参考数据视图,逻辑身份为 `(RTYPE, RKEY)`;普通类别的 `RKEY` 见上表,`RSTA` 的身份必须同时包含 `RTYP` 与 `RSID`。记录保存消息来源、消息批次、刷新时间与按 SIS 标签名组织的字段载荷;重复字段保留输入顺序并表示为有序数组。参考数据保存在独立的数据表中,admin-api 直接读取(`C-10`)。
|
||||
|
||||
- **13 类参考数据**:`DNLD`/`RESP` 是类别全量,整批校验通过后原子发布;`ADD`/`UPD`/`DEL` 是单条全字段增量,按 `(RTYPE, RKEY)` 处理。全量替换只作用于消息指定的同一 `RTYPE`。
|
||||
- **资源状态**:`RSTA-DNLD` 是单条状态更新,按 (`RTYP`, `RSID`) 覆盖;`RSTA-RESP` 是请求返回的多条记录。两者都不以“本包未出现”为理由删除其他资源状态。
|
||||
@@ -560,4 +560,4 @@ SIS 声明的上游忽略与截断口径(`SIS:3.1`/`SIS:3.2`/`SIS:3.4`/`SIS:3.
|
||||
- 数据方向固定为「SIS 消息 → 本网关 → 业务数据库 → admin-api」;本网关不调用 admin-api,不读取其数据库或缓存。
|
||||
- admin-api 只读取已提交的航班状态与 `REF_MASTER` 有效视图,不参与消息解码、合并、批次发布或处理终态判定。
|
||||
- 开发运行时使用自有 PostgreSQL;Oracle 只有通过 `Q1` 要求的方言与集成验证后才可替代,单次部署不得同时把两库作为权威。
|
||||
- admin-api 直接读取本系统写入的静态参考数据表(`C-31`);共享 MySQL 始终只是信箱边界,不承载该读取模型。
|
||||
- admin-api 直接读取本系统写入的静态参考数据表(`C-10`);共享 MySQL 始终只是信箱边界,不承载该读取模型。
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
本服务是**只读数据层**。不生产航班动态,不保存实时航班。实时推送、保障流程、报文收发与解析落库由 AODB / 消息中间件负责。
|
||||
|
||||
判定数据源:Controller 注入的 DAO 在 `domain.secondary` 包 → **Oracle**;历史航班走 ES;字典走 MySQL。双数据源原理见 [datasource.md](datasource.md)。
|
||||
判定数据源:Controller 注入的 DAO 在 `domain.secondary` 包 → **Oracle**;历史航班走 ES;字典走 MySQL。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
**非目标**:
|
||||
|
||||
- 航班当前态权威只在自有 PG;Redis 仅作查询投影,不作权威或处理状态。不引入并行主泵或分布式锁。
|
||||
- 共享 MySQL 只做读写消息和写回处理标记,不改表结构、不建表、不清数据。
|
||||
- 共享 MySQL 只做读写消息和写回处理标记,不改表结构、不建表;已回填的入站行超过保留期后由本系统清理(specification.md 的 `C-1`)。
|
||||
- 本消息网关只有一个实例,暂不考虑多实例运行方案。
|
||||
- 对外投递只承诺至少一次;同一航班(`FLID`)内保序,不同航班之间不承诺顺序。
|
||||
- 测试环境用 PostgreSQL;生产环境尚未决定用 PostgreSQL 还是 Oracle 11g,Oracle 适配验证通过前不构成支持承诺。
|
||||
@@ -63,7 +63,7 @@
|
||||
**验收标准**
|
||||
|
||||
1. 一次只处理一条消息,取编号最小的未完成消息;处理中的消息不让后面的越过。
|
||||
2. 报文不合法:进死信。报文合法但本系统不支持该类型:跳过留档,按已处理写回标记。原始报文留在信箱,保留期由库方决定。
|
||||
2. 报文不合法:进死信。报文合法但本系统不支持该类型:跳过留档,按已处理写回标记。原始报文留在信箱,已回填的行由本系统按保留期清理(`C-1`)。
|
||||
3. 处理或提交失败:失败的事务回滚,消息保持未完成,下一轮自动重新处理。
|
||||
4. 处理只动本系统数据库;发 Kafka、回填信箱在处理完成之后单独做。
|
||||
5. 错误必须记录到对应消息的处理记录上,不能被外层吞掉。
|
||||
|
||||
+11
-14
@@ -48,7 +48,7 @@
|
||||
|
||||
### 2.3 HTTP 入口
|
||||
|
||||
- **C-7** `POST /cminmsgs/send`:把 XML 写进入站信箱,与 adapter 投递走同一套处理。成功返回消息编号(仅表示已入库、未处理);失败不返回编号。支持 `text/xml`、`application/xml`、`text/plain`(UTF-8);空、超长、格式错的不写;解析不拉外部资源。内网,访问由网络配置控制。仅内部联调;长度上限与失败响应实现时自定(`Q15`)。
|
||||
- **C-7** `POST /cminmsgs/send`:把 XML 写进入站信箱,与 adapter 投递走同一套处理。成功返回消息编号(仅表示已入库、未处理);失败不返回编号。支持 `text/xml`、`application/xml`、`text/plain`(UTF-8);空、超长、格式错的不写;解析不拉外部资源。内网,访问由网络配置控制。仅内部联调;长度上限与失败响应由实现自定。
|
||||
- **C-8** `POST /schd/sync`:向出站表写入一条日计划请求。
|
||||
待确认:请求参数、HTTP 响应(`Q16`)。
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
### 4.1 管道
|
||||
|
||||
- **INV-1** 处理时间仍为空的信箱行会登记到本地;同一编号只登记一次。重扫或重启不会重复登记,也不会漏掉未登记的行。
|
||||
- **INV-2** 只有本地处理结束后,才写信箱里的处理时间;本地记「已结束」时,必须同时记下还要去更新信箱,两笔记在同一次写入里。
|
||||
- **INV-2** 只有本地处理结束后,才写信箱里的处理时间;本地记「已结束」时,必须同时记下还要去更新信箱,两笔记在同一次写入里。回填只把空标记写成完成时刻,不覆盖已有值(本系统单方承诺)。
|
||||
- **INV-3** 航班增量与删除:改状态和记「待发 Kafka」同一次写入;记「已结束」和「还要更新信箱」另一次写入,且须在 Redis 写成功之后。处理未结束前不发 Kafka(`US-03` AC4)。日计划与静态参考数据见架构「主流程」。
|
||||
- **INV-4** 日计划整份报文校验不过时,本地航班数据一律不改(`US-07` AC1)。
|
||||
|
||||
@@ -107,11 +107,10 @@
|
||||
| 编号 | 事项 | 当前假定 | 影响 |
|
||||
|---|---|---|---|
|
||||
| Q1 | `schd` 的 Kafka record 粒度 | 已定原则:按旧系统,两次 tick 之间积累的整批序列化成一个 JSON 数组作为单条 record 发出(`C-9`) | 消费方未确认按此格式解析 |
|
||||
| Q2 | 请求与应答按时间匹配时的时钟偏斜容忍判据 | 比较前统一时区与单位(implementation.md「上游请求与静态数据」) | 容忍判据未定前,降级匹配不得描述为精确关联 |
|
||||
| Q3 | 现场会发但 SIS 未定义的子类型(靠桥、延误等)的报文形态与逐类终态 | 按现有处理逻辑延续,不得因 SIS 未记载就丢掉(`US-05` AC1) | 逐类终态与幂等规则未定(`G-FLOP-SEMANTICS`) |
|
||||
| Q4 | 上游重发时是否可能改发正文 | 报文不可变,绑定身份后不比对内容(implementation.md「消息、身份与决策」) | 改发正文的重发会被判为重复并跳过 |
|
||||
| Q5 | `msg` 的 value 字段与类型、编码方式、变更与删除的区分方式 | 沿用旧系统:value 是 `MSG` 的 JSON(`META` 加对应业务体),日计划到达通知只有 `META`(接口契约「Kafka」) | 消费方读取契约无法定稿 |
|
||||
| Q6 | 网页客户端读取 Redis 投影的约定 | 沿用旧系统的 hash `flightInfo`:field 为 `FLID`,value 为完整航班对象的带类型 JSON,不设过期;写入与移除时机见 `INV-7`、`INV-8`、`INV-10`;派生字段 `MAFL`、`abdg` 是否随投影提供仍未定;只作查询、不是权威;与 `GET /all/flights` 同一份(`C-11`;接口契约「Redis:航班查询投影」) | 消费方读取契约无法定稿 |
|
||||
| Q6 | 网页客户端读取 Redis 投影的约定 | 沿用旧系统的 hash `flightInfo`:field 为 `FLID`,value 为完整航班对象的带类型 JSON,不设过期;写入与移除时机见 `INV-7`、`INV-8`、`INV-10`;派生字段 `MAFL` 是否随投影提供仍未定;`abdg` 本版不提供,旧系统拼它的数据源(机位与登机桥映射缓存)已列入需求「范围与非目标」不交付;只作查询、不是权威;与 `GET /all/flights` 同一份(`C-11`;接口契约「Redis:航班查询投影」) | 消费方读取契约无法定稿 |
|
||||
|
||||
答复就地更新结论,并按 [README.md](README.md)「维护清单」落到对应条款。
|
||||
|
||||
@@ -134,15 +133,12 @@
|
||||
| 编号 | 事项 | 当前假定 | 影响 |
|
||||
|---|---|---|---|
|
||||
| Q14 | 生产库选型 | 自有 PG 是唯一权威;生产环境用 PostgreSQL 还是 Oracle 11g 不能从三份依据确定,Oracle 适配验证通过前不作支持承诺 | 生产部署验收 |
|
||||
| Q15 | `POST /cminmsgs/send` 的长度上限与失败响应 | 仅内部联调、无外部引用;成功返回编号等行为见 `C-7`;上限与失败格式现阶段不定,实现时在代码里自定 | 不阻塞对外契约 |
|
||||
| Q16 | `POST /schd/sync` 的请求字段与时间格式、成功响应表示已登记还是已落信、状态码与错误响应 | 交付承诺止于落信(`C-4`);旧系统线索为 `{startDate, endDate}` 与 12 小时制时间(接口契约「HTTP」) | 响应契约无法定稿(`C-8`) |
|
||||
| Q17 | 人工发起 `RQRD` 的方式 | `US-09` 要求人工发起,HTTP 接口清单没有对应入口 | 参考数据请求无法人工触发 |
|
||||
| Q18 | 回退时在途消息(已提交业务变更、未到处理完成)的处置 | 回填了结后切换(`OPS-4`);在途消息无跨系统幂等保障 | 回退演练的验收口径(`OPS-4`) |
|
||||
| Q19 | 是否在自有 PG 留存入站原文副本,及原文提前清除时已登记消息的处置 | 不留存,原文只从信箱读取 | 提前清除的消息不可恢复,处置未定 |
|
||||
| Q20 | 日计划中运营日冲突的处置 | 未定 | 冲突场景无法验收 |
|
||||
| Q21 | `GET /all/flights` 的状态码、错误响应样例、外层包装是否沿用旧 `ResponseDto` | 返回体是消息文档中的 XML 结构转换出的 JSON;读 Redis、返回全体动态航班、不分页(`C-11`) | 查询契约无法定稿 |
|
||||
| Q22 | `REF_MASTER` 的物理列、唯一键、空值存储与写入后可见时点 | 记录用类别码加识别标签识别(接口契约「静态参考数据类别与编号来源」) | admin-api 读取契约无法定稿(`C-10`) |
|
||||
| Q23 | Elasticsearch 历史索引、文档 ID、字段映射、成功判据、保留期与容量上限、写入结果不明的对账与幂等策略 | 历史写入确认成功才删实时数据(`D1`、`US-14` AC3) | 历史链路无法验收(`US-14`;`G-FLIGHT-HIST-RETENTION`) |
|
||||
| Q22 | 13 类报文与资源状态如何映射到 admin-api 实体对齐的基础数据表组(联调栈 `basicdata` schema 为承载) | 表与列直接取 admin-api 实体注解,不改名、不合并(接口契约「自有 PostgreSQL:内部存储与 admin-api 只读」);类别码与识别标签见接口契约「静态参考数据类别与编号来源」;表组物理形态属内部迁移 DDL,不作待决 | admin-api 读取契约无法定稿(`C-10`) |
|
||||
| Q23 | Elasticsearch 历史索引、文档 ID、字段映射、成功判据、保留期与容量上限 | 文档 ID 沿用旧系统 `SODT + FLID` 幂等 upsert,写入结果不明时重试同一写入(接口契约「Elasticsearch 航班历史写入」);历史写入确认成功才删实时数据(`D1`、`US-14` AC3) | 历史链路无法验收(`US-14`;`G-FLIGHT-HIST-RETENTION`) |
|
||||
| Q24 | `REQ_TRACK` 已结案记录的保留期取值 | 到期清理没有可依据的窗口(`G-REQ-TRACK-RETENTION`) | 请求历史清理无法实现(`US-09`) |
|
||||
| Q25 | 季度计划的数据来源与归属:admin-api 从本系统库读季度计划,而 SIS 只有日计划事件(`SIS:3.16`、`SIS:3.17`、`SIS:4.7`) | 应由 AODB 下发,报文形态待确认;旧系统读 Oracle 的 `FIMS_FLIGHTSCHD_SEASON` | admin-api 的季度计划查询没有供数方 |
|
||||
|
||||
@@ -164,6 +160,7 @@
|
||||
| `G-SCAN-PREDICATE` | 收报仍按水位扫描,不是按「处理时间为空」读取 | `US-01`;`INV-1` |
|
||||
| `G-REDIS-PROJECTION` | Redis 投影没有写入与移除路径 | `US-05`、`US-06`、`US-07`、`US-12` |
|
||||
| `G-SCHD-SNAPSHOT` | 日计划快照不删除缺席航班、不清除未携带字段,也没有分批;逐航班重写幂等未补齐 | `INV-7`;`INV-3`;`INV-9` |
|
||||
| `G-RESP-GUARD` | `SCHD-RESP` 没有过期判断,晚到的应答也会更新本地数据 | `US-07` |
|
||||
| `G-PROC-CLEANUP` | 处理记录的到期清理作业未实现 | `US-11` |
|
||||
| `G-REF-DATA` | 静态参考数据没有处理,当前按「合法但不支持」跳过并回填;参考数据表与 admin-api 直读未落地 | `US-13`;`US-03` |
|
||||
|
||||
@@ -173,7 +170,7 @@
|
||||
|---|---|---|
|
||||
| INV-1 | `US-01` AC1/AC2/AC4 | 扫描重来与重启后登记数不变、行不丢;同一编号重复出现时处理记录数不增加 |
|
||||
| INV-1、C-7 | `US-02` AC1~AC5 | 兼容入口接受三种媒体类型、默认 UTF-8;空报文、超上限、非法 XML 不落信并返回错误,解析禁用外部实体与外部资源;成功返回编号且只表示落信;内网来源由网络层配置核对;写入的行与上游投递同路径被发现、登记 |
|
||||
| CLM-2 | `US-01` AC3、`US-03` AC1 | 按编号升序处理;队头未完成时后面的消息不被处理 |
|
||||
| CLM-2(升序) | `US-01` AC3、`US-03` AC1 | 按编号升序处理;队头未完成时后面的消息不被处理 |
|
||||
| US-03 AC2/AC5 | `US-03` AC2/AC5 | 死信与跳过留档且无业务副作用;错误在对应处理记录上可查 |
|
||||
| US-03 AC3 | `US-03` AC3 | 失败回滚后消息仍在未完成;已提交结果不被写信箱处理时间或发 Kafka 失败回滚 |
|
||||
| INV-2 | `US-10` AC1/AC2 | 终态后才回填;重启后继续,写不上的有记录与告警 |
|
||||
@@ -186,7 +183,7 @@
|
||||
| US-14 AC4 | `US-14` AC4 | 历史清理跳过正在被消息处理的航班 |
|
||||
| INV-4 | `US-07` AC1 | 校验失败后本地数据不变 |
|
||||
| INV-9 | `US-07` AC4/AC5 | 分批失败后整包重处理收敛到同一目标(`G-SCHD-SNAPSHOT` 闭合前无法验证);Redis 在整包写入完成后按快照刷新,成功即与快照一致 |
|
||||
| CLM-1 | `US-03` | 同一消息不产生两次效果;逐子类型规则与幂等矩阵在 `Q3`、`G-FLOP-IDEMPOTENT`、`G-FLOP-SEMANTICS` 闭合前无法验证 |
|
||||
| CLM-1(幂等收敛) | `US-03` | 同一消息不产生两次效果;逐子类型规则与幂等矩阵在 `Q3`、`G-FLOP-IDEMPOTENT`、`G-FLOP-SEMANTICS` 闭合前无法验证 |
|
||||
| INV-8 | `US-06` AC1 | 航班标记删除后从投影移除;移除失败时下轮重做 |
|
||||
| US-14、D1 | `US-14` AC3 | 历史写入成功才删实时数据;删除事件在实时数据删除前登记(`D1`) |
|
||||
| US-06 AC2 | `US-06` AC2 | 删共享联动主航班;删主航班级联删共享 |
|
||||
@@ -195,9 +192,9 @@
|
||||
| US-11 | `US-11` AC1/AC2 | 未完成的记录不被删除 |
|
||||
| US-13 | `US-13` AC1~AC5 | 全量整体替换、增删改逐条;空值是「没有值」不是删除;一类校验失败只停该类;参考数据落独立表供 admin-api 只读(`C-10`) |
|
||||
| US-10 AC2 | `US-10` AC2 | 写失败重试与告警可观测 |
|
||||
| CLM-4 | `US-09` AC1~AC3 | 出站请求写入 `COUTMSGS` |
|
||||
| CLM-4(止于落信) | `US-09` AC1~AC3 | 出站请求写入 `COUTMSGS` |
|
||||
| CLM-5(不承诺完成时限) | — | 需求未定完成时限;现场一般为即时处理 |
|
||||
| CLM-6(容量) | — | 现场量级暂无;有数据后再估 |
|
||||
| OPS-4 | `OPS-4` | 回退演练:回填了结后切回,旧系统不重处理已产生业务效果的消息;在途窗口处置见 `Q18` |
|
||||
| CLM-7 | `OPS-1` | 配置错误启动失败测试可验收 |
|
||||
| OPS-4(切换与回退) | `OPS-4` | 回退演练:回填了结后切回,旧系统不重处理已产生业务效果的消息;在途窗口处置见 `Q18` |
|
||||
| CLM-7(启动拒绝) | `OPS-1` | 配置错误启动失败测试可验收 |
|
||||
| PRE-1(测试隔离) | `OPS-3` | 测试环境配置核对:独立的数据库、Redis 与 Kafka 主题,不连接生产信箱 |
|
||||
|
||||
Reference in New Issue
Block a user