docs(acm2-74): 补齐 FLOP 逐类语义、静态参考数据与数据结构
自洽与精简: - specification 补第四种状态词 [我们自证]、验证映射补 INV-14 两行、去 CLM-7/CLM-9 的进度语、补编号空缺说明 - architecture/requirements/implementation 去除逐字复述(领域决策三写句、时间常数排序、C-25/C-26、INV-12/21/22)与参数值重复 - README 与新文档对齐:收报谓词改 ID>W、删不存在的 reference/ 包与 lua/、删 msgx.phase 与 MSGX_REDIS_URI、设计权威口径改 docs/、进度段改指 Plane 内容补齐: - 新增 implementation.md「动态运行事件(FLOP)」:按 SIS 3.19–3.43 的 25 类逐类映射与空标签语义(含 CNCL 空标签为撤销等),补 RMS→AODB 方向拒绝、ROUT 只保留 4 条、VIPP 忽略等约束;厘清 legacy 29 类与 SIS 25 类的差集 - 新增 implementation.md「静态参考数据」章:13 类参考数据与资源状态的 RTYPE/RKEY、list 与增量合并语义、删除只由 DEL 表达、SLST/REMT/RSTA 机位与登机桥映射 - §11.3 数据结构改为标量分组表与集合明细表(元素键、条数上限、SIS 锚点) - specification 新增 G-FLOP-DIRECTION / G-FLOP-UNMAPPED / G-REF-DATA;Q8 收窄为真实报文分布与 admin-api 清单
This commit is contained in:
@@ -34,6 +34,8 @@
|
||||
| 退避 / `claim-batch` / 回填期限等取值 | reference.md「参数」 | 其余文档只引 `PARAM:<key>` |
|
||||
| 消费权排他、ID 不复位、报文不可变、时钟、单实例 | specification.md「前提」 | 其他文档只引 `PRE-x` |
|
||||
| 航班身份、合并语义、`STATE_VERSION`、`OPERATION_DAY` | implementation.md「航班域」 | 其余文档只引域规则与 `INV-x` |
|
||||
| 航班动态逐类语义与空标签规则(FLOP) | implementation.md「动态运行事件」 | specification.md 记 `Q8` 与 `G-*`;requirements.md 写验收口径 |
|
||||
| 参考数据类别、结构与资源状态 | implementation.md「静态参考数据」 | requirements.md 写取数与刷新验收;参数在 reference.md |
|
||||
| 对外术语(落信 / 入站 / 库方 / 处理标记) | specification.md「术语」 | — |
|
||||
| 管道内部术语(`W` / 队头 / 终态 / 回填意图) | implementation.md「术语与持久化记录」 | — |
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgexchange-v2 是机场 OMMS 的上游报文处理中间件,用于替换旧版 `msgexchange-api`。
|
||||
它读取 CIIMS、AODB 等系统写入共享 MySQL 信箱的 XML 报文,按顺序更新航班动态,再将结果提供给下游。
|
||||
|
||||
本系统负责**收报、解析、状态更新和结果投递**,不生成上游业务报文,不替代 CIIMS/AODB,也不提供 AODB 主数据编辑能力。
|
||||
本系统负责**收报、解析、状态更新和结果投递**,不生成上游业务报文;其余非目标见 [requirements.md](requirements.md)「范围与非目标」。
|
||||
|
||||
- **主要入口**:轮询共享 MySQL 的 `CMINMSGS`。
|
||||
- **兼容入口**:`POST /cminmsgs/send`,供现役兼容、手工工具和对拍使用;写入信箱后返回记录 ID,不是生产收报主路径。
|
||||
@@ -51,7 +51,7 @@ CIIMS / AODB 等上游
|
||||
|---|---|
|
||||
| `ingress` | 轮询信箱、持久化入队及兼容 HTTP 写入;不解析业务报文。 |
|
||||
| `codec` | XML 解码,区分非法报文与可修复的解码失败。 |
|
||||
| `processing` | FIFO 调度、业务身份绑定与去重、领域决策与落库(SCHD/FLOP/FDEL/ADFT):纯领域逻辑只返回决策;Processor 作为事务协调器,在锁事务内完成状态写入、事件与回填意图登记,不直接触碰 Kafka。 |
|
||||
| `processing` | FIFO 调度、业务身份绑定与去重、领域决策与落库(SCHD/FLOP/FDEL/ADFT);决策、事务与回填的职责边界见 [implementation.md](implementation.md)「消息、身份与决策」与 `INV-17`。 |
|
||||
| `delivery` | 消费待发事件,负责按目标保序、`schd` 聚合、投递和失败重试。 |
|
||||
| `jobs` | 回填补偿扫描、航班历史清理与留痕保留期清理;独立 job 线程执行,不参与 FIFO(与主泵的互斥见 `INV-18`)。 |
|
||||
| `domain` / `config` | 领域状态、事件和决策模型,以及运行参数。 |
|
||||
@@ -86,7 +86,7 @@ CIIMS / AODB 等上游
|
||||
|
||||
**不使用跨库事务。** PG 事务只能保证「处理结果与待发事件一起提交」(`INV-17`),不能覆盖 MySQL 回填或 Kafka 发送等外部副作用。跨存储依靠幂等、重试和持久化补偿恢复;各中断位置的判定与恢复动作见 [implementation.md](implementation.md)「中断恢复」。
|
||||
|
||||
对外投递按**至少一次**设计,不承诺端到端恰好一次。Kafka 生产者幂等不能消除应用重启或 outbox 重发带来的所有重复。
|
||||
对外投递的承诺边界见 `C-29`;Kafka 生产者幂等不能消除应用重启或 outbox 重发带来的所有重复。
|
||||
|
||||
## 7. 关键决策
|
||||
|
||||
@@ -96,5 +96,5 @@ CIIMS / AODB 等上游
|
||||
|---|---|---|
|
||||
| D1 | 航班清场只在历史写入成功后进行,未接通时删 0 条;未经 FDEL 的清场须先补发删除事件。ES 历史投影(阶段 B)暂缓。 | 红线见 [implementation.md](implementation.md)「生命周期」 |
|
||||
| D2 | 动态状态单写者,生产只允许一个活动实例;多实例必须先具备可靠的排他保护。 | 事务行锁见 [implementation.md](implementation.md)「事务边界」;实例级排他属 `PRE-5`,可声明性见 `CLM-6` |
|
||||
| D3 | Kafka 生产要求 `acks=all`、`enable.idempotence=true`、`max.in.flight=1`;不允许通过关闭幂等来满足生产接入。 | 取值见 [reference.md](reference.md) 参数表 |
|
||||
| D3 | Kafka 生产必须同时满足确认级别、幂等生产与单连接在途上限三项约束;不允许通过关闭幂等来满足生产接入。 | 取值见 [reference.md](reference.md) 参数表 |
|
||||
| D4 | 自有库终态记录只归档到 `PROC_STATE_HST`,不侵入共享库的表结构或保留策略。 | `G-PROC-HST` |
|
||||
|
||||
+144
-23
@@ -1,9 +1,10 @@
|
||||
# 实现设计
|
||||
|
||||
本文件是实现设计的唯一出处,分两章:
|
||||
本文件是实现设计的唯一出处,分三章:
|
||||
|
||||
- **处理管道**章:记录模型、状态机、收报与水位、主泵与事务边界、回填、快照与请求、投递、失败恢复与维护作业;
|
||||
- **航班域**章:航班当前态的权威模型、合并与写入语义、删除与重建。
|
||||
- **航班域**章:航班当前态的权威模型、合并与写入语义、删除与重建;
|
||||
- **静态参考数据**章:主数据类别与编码、`REF_MASTER` 结构与合并语义、资源状态与机位/登机桥映射。
|
||||
|
||||
正文描述**目标设计**,不标注交付状态:可声明性见 [specification.md](specification.md)「声明边界」与「当前已知偏差」,进度在 Plane(ACM2)。契约与不变量只引稳定 ID;参数取值只引 `PARAM:<完整键>`(见 [reference.md](reference.md))。
|
||||
|
||||
@@ -27,7 +28,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` 是本地入队时间、非空、是超期判据的唯一依据;归档后的去重影子行置 `STATE='ARCHIVED'`、只保留 `IDENTITY_KEY` 与 `MSG_ID`,不占队头、不触发回填、不参与积压聚合(`G-PROC-HST`)。 |
|
||||
| `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 内写入,是保留期判定的唯一基准。 |
|
||||
| `REQ_TRACK` | 上游请求及应答关联 | 状态 `PENDING / SENT / DONE / EXPIRED`;保存请求类型、覆盖运营日、发送方、出站信箱 ID 与发送/完成时间;**「同类只允许一个开放请求」的唯一键 = `(请求类型, 覆盖运营日, 发送方)`,且仅对开放状态生效**。 |
|
||||
| `REF_MASTER` | 静态参考数据(目标表) | `(RTYPE, RKEY)` 唯一;客户端与刷新流程见 [requirements.md](requirements.md) `US-13`/`US-14`。 |
|
||||
| `REF_MASTER` | 静态参考数据与资源状态(目标表) | `(RTYPE, RKEY)` 唯一;`RTYPE` 类别、合并语义与资源状态见「静态参考数据」;取数路径见 [requirements.md](requirements.md) `US-13`/`US-14`。 |
|
||||
| `FLIGHT_SCHD` | 航班标量及单值异常字段 | `FLID` 主键;`OPERATION_DAY` 一经确定不可变;版本与最近消息 ID 用于追踪。变长集合存于资源明细表与 `FLIGHT_ROUTE_POINT`,规则见「航班域」。 |
|
||||
| `INBOX_CURSOR` | 消费水位 `W`、空洞计时 `holeSince`、播种事实 `SEEDED_AT` | 单行游标;`W` 只随新 ID 成功入队推进,遇空洞即停;`HOLE_SINCE` 持久化空洞观测时刻,进程重启不丢计时。`SEEDED_AT IS NULL` **不等于**从未消费(已有库新增列后同样为 NULL)。 |
|
||||
| `SCHD_SNAP_LOG` | 日计划处理留痕 | 只追加、可重建,不参与状态决策;保留期见 [reference.md](reference.md)。 |
|
||||
@@ -344,16 +345,11 @@ PENDING → SENT → DONE
|
||||
|
||||
归档范围只含终态;归档后仍须保留业务去重能力(`INV-9`)——去重记忆期长于工作状态在线期,实现取「主表保留去重影子行」:主行置 `STATE='ARCHIVED'`、只留 `IDENTITY_KEY` 与 `MSG_ID`,`IDENTITY_KEY` 唯一约束留在主表不动。队头推进、`backlog()` 与回填扫描的谓词显式排除 `ARCHIVED`,不靠状态包含列表隐式过滤。
|
||||
|
||||
**时间常数排序**(取值见 [specification.md](specification.md)「契约数值」)
|
||||
|
||||
1. `R ≤ R_keep`(`C-7`)。
|
||||
2. 去重记忆期 ≥ `R_keep`;否则「归档后重复」不成立(`INV-9`)。
|
||||
3. 回填放弃清单可见期 ≥ `R_keep`;否则库方清除缺 `C-8` 依据(`C-16`)。
|
||||
4. 归档阈值计的是**终局之后**的时间,不是入队之后:终态行未了结回填时不进入候选。
|
||||
**时间常数排序**:`R ≤ R_keep`、去重记忆期 ≥ `R_keep`、放弃清单可见期 ≥ `R_keep` 三个下界关系的定义与理由见 [specification.md](specification.md)「契约数值」,本文件不复述。只补一条实现口径:归档阈值计的是**终局之后**的时间,不是入队之后——终态行未了结回填时不进入候选。
|
||||
|
||||
**其余清理**
|
||||
|
||||
- **航班历史清理**:按 [reference.md](reference.md) 的历史判据选候选(含 `DELETED`),先成功归档再删除;未经 FDEL 的生命周期清除需先补发删除事件。语义与红线见「航班域」。
|
||||
- **航班历史清理**:按 [reference.md](reference.md) 的历史判据选候选(含 `DELETED`),先成功归档再删除;语义与红线见「航班域」与 `D1`。
|
||||
- **留痕清理**:`SCHD_SNAP_LOG` 按保留期与 `(SCOPE_END, RECV_AT)` 删除,不依赖历史存储开关。
|
||||
- **出站事件清理**:见「事件清理」。
|
||||
|
||||
@@ -380,8 +376,6 @@ PENDING → SENT → DONE
|
||||
- 单活动主泵按信箱 FIFO 推进。事务内 `PIPELINE_LOCK` 只串行化本地状态提交,不替代选主或消息认领。
|
||||
- 状态写入、outbox 事件、处理终态和回填意图在同一 PostgreSQL 事务中提交(`INV-17`);回填与 Kafka 投递在提交后独立重试。
|
||||
|
||||
现场目标库为 Oracle 11g;Oracle 适配必须通过方言与集成验证后才能作为可切换的运行时选项。
|
||||
|
||||
### 11.1 权威模型
|
||||
|
||||
| 对象 | 职责 |
|
||||
@@ -398,32 +392,60 @@ PENDING → SENT → DONE
|
||||
|
||||
`FLID` 是主键。`OPERATION_DAY` 从 SCHD 记录的 `SODT` 按配置的机场时区和切日规则推导;它不是消息接收日或落库日。
|
||||
|
||||
一旦已写入非空 `OPERATION_DAY`,同一 `FLID` 不得改到另一个运营日(`INV-12`)。遇到冲突,整包日计划按协议错误拒绝,既有状态保持不变(`INV-19`)。尚未由日计划收录的航班可以为 `NULL`;这不表示该航班没有运营日,只表示当前模型无法为它确定归属日。
|
||||
运营日一经写入不可更改(`INV-12`)。遇到冲突,整包日计划按协议错误拒绝,既有状态保持不变(`INV-19`)。尚未由日计划收录的航班可以为 `NULL`;这不表示该航班没有运营日,只表示当前模型无法为它确定归属日。
|
||||
|
||||
### 11.3 字段与集合
|
||||
|
||||
标量与异常对象前缀字段存于主表。协议中的 `SRVT`、`VIPF` 是无界集合,目标形态必须按集合完整保存到专用明细表示;专用明细、合并与投递见 `G-SRVT-VIPF`。`MAFL` 不是 SIS/XML 入站字段,而是由共享航班的 `MAID`、`FLID`、`FLNO` 生成的主航班派生投影(`G-MAFL`)。
|
||||
航班当前态分三层:主表标量、集合明细、路线点。**键名一律取 SIS 标签名**(不改写、不合并同义标签),集合元素内的键取属性名或子标签名。字段的业务语义、值域与长度以 [SIS 接口规范](legacy/SIS_AODB_RMS-V0.1.md) 与 [XSD](legacy/unisysaodbsis.xsd) 为准;本节只定义目标形态与合并语义。
|
||||
|
||||
**标量**(存于 `FLIGHT_SCHD` 主行,出现即覆盖;空串为显式清空)
|
||||
|
||||
| 组 | 标签 |
|
||||
|---|---|
|
||||
| 身份与计划 | `ALCD`、`ALSC`、`FLNO`、`MVIN`、`SODT`、`FLTY`、`FLIN`、`ACFT`、`RENO` |
|
||||
| 班次与运营 | `TAOP`、`TAFL`、`TAID`、`TRML`、`CSOP`、`CSFT`、`MAID` |
|
||||
| 时间 | `ESTT`、`ACTT`、`BOTM`、`LACL`、`FINT`、`APPT`、`EGSR`、`EGST`、`PADT`、`NAAT`、`NEAT`、`PEDT`、`FTSS` |
|
||||
| 资源与状态 | `STND`、`PHAG`、`FHAG`、`MHAG`、`CNCL`、`REMC`、`MAXP`、`VIPP`、`VIPR`、`LBNO`、`LBWT`、`PAXC`、`EXSC`、`EXSR` |
|
||||
|
||||
**集合**(存于明细表;报文带了该集合就按完整合并结果整体替换,元素顺序取报文顺序;未出现则保留本地值)
|
||||
|
||||
| 集合 | 元素键(属性在前) | 条数上限 | 定义处 |
|
||||
|---|---|---|---|
|
||||
| `GTDT` | `GTNO`、`GATE`、`PGOT`、`PGCT`、`GOTM`、`GCTM`、`GTYP` | 99 | `SIS:3.34` |
|
||||
| `CKDT` | `CKNO`、`CHKC`、`CCLS`、`PCOT`、`PCCT`、`COTM`、`CCTM`、`CTYP` | 99 | `SIS:3.24` |
|
||||
| `CLDT` | `CLNO`、`BELT`、`BCLS`、`PCOT`、`PCCT`、`FBAG`、`LBAG`、`BTYP` | 99 | `SIS:3.25` |
|
||||
| `CHDT` | `CHNO`、`CHUT`、`CCLS`、`PCBT`、`PCET`、`CBTM`、`CETM`、`CTYP` | 99 | `SIS:3.26` |
|
||||
| `PSDT` | `PSNO`、`PSST`、`STST`、`STET` | 9 | `SIS:3.38` |
|
||||
| `CHOT` | `CSNO`、`CHTM`、`CHID`、`CHST` | 99 | `SIS:3.22` |
|
||||
| `DELY` | `CODE`、`STRT`、`DURA`、文本 | — | `XSD` `FLOP` 段 |
|
||||
| `ABTM` | `ASNO`、`ABDG`、`ABOP`、`AOTM` | 99 | `XSD` `FLOP` 段 |
|
||||
| `ROUT` / `ERUT` | `RTNO`、`APCD`、`SCAT`、`SCDT` | 6 / 7(`ROUT` 只取 4) | `SIS:3.40` |
|
||||
| `SRVT` | `OPER`、`SRTC`、`SRQT`、`SRST`、`SRET`、`SRPR`、`SANR`、`SARR` | 无界 | `G-SRVT-VIPF` |
|
||||
| `VIPF` | `OPER`、`VPCD`、`VFES`、`VIPT/OPER`、`VIPT/VSCD`、`VIPT/VTQY`、`VIPT/VTST`、`VIPT/VTET` | 无界 | `G-SRVT-VIPF` |
|
||||
|
||||
`SRVT`、`VIPF` 只保留出现事实与原始内容,不参与合并与投递。`MAFL` 不是 SIS/XML 入站字段,而是由共享航班的 `MAID`、`FLID`、`FLNO` 生成的主航班派生投影(`G-MAFL`)。
|
||||
|
||||
- `ORDINAL` 是持久化顺序,从 1 开始;`SOURCE_SEQ` 是上游序号,允许为空或重复。
|
||||
- 相同资源号不代表同一条分配,禁止按资源号去重。
|
||||
- 每次持久化完整航班状态时,明细表按该 `FLID` 先删后插,以完整合并结果为准(`INV-14`)。
|
||||
- ROUT 与 ERUT 是两类独立集合,不能因相同序号覆盖彼此。
|
||||
- `CHDT` 的类字段在 SIS 正文写作 `CCLS`/`CTYP`、在 `XSD` 写作 `CHCLS`/`CHTYP`,**以 `XSD` 为准**。
|
||||
- 主/共享关系以主表的 `MAID` 为事实来源:`MAID` 是共享航班指向主航班 `FLID` 的引用(非共享航班为 `NULL`);`MAFL` 只在读取和事件投影时从子航班事实派生,不按入站标量解析或保存。
|
||||
|
||||
### 11.4 主/共享投影(`MAFL`)
|
||||
|
||||
`MAFL` 是主航班的派生集合,元素为子航班的 `FLID` 与 `FLNO`;内容与变更传播分别由 `INV-21`、`INV-22` 保证。
|
||||
|
||||
- 子航班集合 = `STATE = ACTIVE` 且 `MAID = 主航班 FLID` 的 `FLIGHT_SCHD` 行;已 FDEL 的子航班(`STATE = DELETED`)自然退出投影,不需要改写主航班行。
|
||||
- 已 FDEL 的子航班(`STATE = DELETED`)自然退出投影(内容见 `INV-21`),不需要改写主航班行。
|
||||
- 只有 `MAID` 为空的主航班携带 `MAFL`;共享航班只携带自身 `MAID`、`CSOP`、`CSFT`,不携带 `MAFL`,避免下游双向合并。
|
||||
- 投影按 `FLID` 升序,与到达顺序及 `FLNO` 变更无关:同一 `STATE_VERSION` 的投影逐字节稳定,重发与消费端比对才有意义。
|
||||
- 同一 `STATE_VERSION` 的投影逐字节稳定(顺序见 `INV-21`),与到达顺序及 `FLNO` 变更无关;重发与消费端比对才有意义。
|
||||
- `MAID = FLID` 的自引用行不进入任何 `MAFL`;`MAID` 指向不存在主航班的悬挂引用不阻断该子航班自身处理,只是不产生投影。
|
||||
- 子航班集合变化(新增、删除、`MAID` 迁移)必须让涉及的主航班在同一事务内推进 `STATE_VERSION` 并登记主航班事件(`KAFKA:msg` + `KAFKA:schd`);否则整态投影的只进不退写入会丢弃它(见「`schd` 聚合」)。共享航班自身不单独发通知。
|
||||
- 子航班集合变化的传播见 `INV-22`,事件类型为 `KAFKA:msg` + `KAFKA:schd`;否则整态投影的只进不退写入会丢弃它(见「`schd` 聚合」)。共享航班自身不单独发通知。
|
||||
- 派生主航班投影与产生它的状态写入必须同一事务或一致读快照;按 `MAID` 取子航班要求该列有索引(`INV-17`)。
|
||||
|
||||
## 12. 航班域:合并、删除与生命周期
|
||||
|
||||
领域决策逻辑(如 `FlightStateEngine` 及各类 Handler 规则)保持纯粹:它根据当前完整态和已解码报文,返回下一完整态与待发事件,不执行数据库或 Kafka I/O。处理器是事务协调器,负责在统一事务边界内调用决策逻辑并持久化结果(`US-03`、`INV-17`)。
|
||||
本章的领域规则只描述「合并成什么态」;决策纯度、事务边界与落库职责见「消息、身份与决策」与 `INV-17`(`US-03`)。
|
||||
|
||||
### 12.1 SCHD 日计划
|
||||
|
||||
@@ -431,15 +453,51 @@ SCHD DNLD/RESP 在整包校验通过后,逐条将报文携带的航班写入
|
||||
|
||||
日计划在重叠字段上可以覆盖当前动态值;未携带的字段按合并规则保留,显式清空才清除。每个成功写入的航班推进 `STATE_VERSION`(`INV-13`),并在同一事务登记 `KAFKA:schd` 与 `KAFKA:msg` 事件。
|
||||
|
||||
**字段缺失语义与外部规范冲突**:SIS 规定最新日计划中未发送的可选字段表示 AODB 已无该数据、子系统应删除本地已有值(`SIS:3.16-note-4`;RESP 与 DNLD 同格式,见 `SIS:3.17`),并要求以 AODB 最新数据覆盖本地(`SIS:1.6.2`)。这与上面的「未携带字段保留」相反。确认前两条并存,按 `Q13` 跟踪,不得据本节推定已与上游对齐。
|
||||
**字段缺失语义与外部规范冲突**:SIS 要求以 AODB 最新数据覆盖本地(`SIS:1.6.2`),且未发送的可选字段表示应删除本地值(`C-26`、`Q13`),与上面的「未携带字段保留」相反。确认前两条并存,不得据本节推定已与上游对齐。
|
||||
|
||||
消息重放由 `PROC_STATE` 的消息 ID 与 `IDENTITY_KEY` 控制;已成功提交的消息不得再次写入或重复登记事件。整包校验失败或运营日冲突时,整包不落地(`INV-19`)。
|
||||
|
||||
### 12.2 动态运行事件
|
||||
### 12.2 动态运行事件(FLOP)
|
||||
|
||||
FLOP 事件只修改它表达的字段或资源集合,其余航班状态保持不变。每个动态子类型的语义都必须有明确 Handler 规则和回归测试,不能只因已被路由就推定其业务语义完整(`INV-20`)。
|
||||
FLOP 只修改报文表达的字段或集合,其余状态保持不变;目标形态与合并规则见「字段与集合」。逐类语义**不靠处理器分支表达,而靠 SIS 的逐类字段表与空标签规则**:下表每一行都必须有一条回归用例钉住「输入 → 目标字段/集合 → 空标签结果」,不能只因报文已被路由就推定语义完整(`INV-20`)。
|
||||
|
||||
动态事件保留既有 `OPERATION_DAY`,也不基于接收时间重新推导它。未知或已删除航班的具体处理遵从对应 Handler 的幂等规则。
|
||||
| SIS | STYP | 目标 | 空标签 / 缺失语义 |
|
||||
|---|---|---|---|
|
||||
| `SIS:3.19` | `ACFT` | `ACFT` 标量 | 字段为 M,未写明空语义 |
|
||||
| `SIS:3.20` | `ACTT` | `ACTT` 标量 | 空 = 清除已有实际时间 |
|
||||
| `SIS:3.21` | `BOTM` | `BOTM` 标量 | 空 = 清除登机时间 |
|
||||
| `SIS:3.22` | `CHOT` | `CHOT` 集合 | 集合按完整结果替换;元素内 `CHTM` 空 = 删除该轮挡时间 |
|
||||
| `SIS:3.23` | `FLTY` | `FLTY` 标量 | 字段为 M,未写明空语义 |
|
||||
| `SIS:3.24` | `CKDT` | `CKDT` 集合 | 空 `<CKDT CKNO="0">` = 现无柜台分配;**AODB 方向报文必须拒绝** |
|
||||
| `SIS:3.25` | `CLDT` | `CLDT` 集合 | 空 `<CLDT CLNO="0">` = 现无转盘分配;**AODB 方向报文必须拒绝** |
|
||||
| `SIS:3.26` | `CHDT` | `CHDT` 集合 | 空 `<CHDT CHNO="0">` = 现无滑槽分配;**AODB 方向报文必须拒绝** |
|
||||
| `SIS:3.27` | `CNCL` | `CNCL` 标量 | 空 = **撤销**上一次取消(不是清空时间) |
|
||||
| `SIS:3.28` | `ESTT` | `ESTT` 标量 | 空 = 删除预计时间 |
|
||||
| `SIS:3.29` | `FDEL` | 走删除路径(「删除与重建」) | 恒为空标签 |
|
||||
| `SIS:3.30` | `FDIV` | `FDIV`(`DDES`/`DDIR`),当前未映射(`G-FLOP-UNMAPPED`) | 空 `DDES=""` = 清除转场标志 |
|
||||
| `SIS:3.31` | `FINT` | `FINT` 标量 | 空 = 删除最终时间 |
|
||||
| `SIS:3.32` | `FLIN` | `FLIN` 标量 | 字段为 M,未写明空语义 |
|
||||
| `SIS:3.33` | `FRET` | `FRET`(`REID`),当前未映射(`G-FLOP-UNMAPPED`) | 空 = 清除返航标志 |
|
||||
| `SIS:3.34` | `GTDT` | `GTDT` 集合 | 空 `<GTDT GTNO="0">` = 现无登机门分配;`GOTM`/`GCTM` 缺失 = 未分配开放/关闭时间;**AODB 方向报文必须拒绝** |
|
||||
| `SIS:3.35` | `LACL` | `LACL` 标量 | 空 = 清除最后通知时间 |
|
||||
| `SIS:3.36` | `MAXP` | `MAXP` 标量 | 空 = 删除最大载客数 |
|
||||
| `SIS:3.37` | `HNAG` | `FHAG`/`PHAG`/`MHAG` 标量 | `FHAG` 空 = 删除该代理;`MHAG` 可缺席 |
|
||||
| `SIS:3.38` | `PSDT` | `PSDT` 集合 | 空 `<PSDT PSNO="0">` = 现无机位分配;**AODB 方向报文必须拒绝** |
|
||||
| `SIS:3.39` | `RENO` | `RENO` 标量 | 空 = 清除注册号 |
|
||||
| `SIS:3.40` | `ROUT` | `ROUT` 集合 | `SCAT`/`SCDT` 分别对起点/终点缺席;只保留 4 条(离港取前 4、到港取后 4)且忽略 `SCAT`/`SCDT` |
|
||||
| `SIS:3.41` | `TAOP` | `TAOP`/`TAFL`/`TAID` 标量 | 任一为空 = 该到达航班的经停连接断开 |
|
||||
| `SIS:3.42` | `TRML` | `TRML` 标量 | 空 = 删除航站楼 |
|
||||
| `SIS:3.43` | `VIPP` | `VIPP`/`VIPR` 标量 | 空 = 删除;SIS 另要求 RMS 忽略 `VIPP`(忽略事件还是忽略字段,SIS 未写明,按 `Q8` 对拍确认) |
|
||||
|
||||
**方向约束**:`SIS:3.24`、`SIS:3.25`、`SIS:3.26`、`SIS:3.34`、`SIS:3.38` 五节明确「RMS will reject this message if received from AODB」——柜台、转盘、滑槽、登机门、计划机位是 RMS→AODB 的分配事件。本系统只从日计划快照接受这五个集合,收到对应 FLOP 报文必须拒绝(当前实现的偏差见 `G-FLOP-DIRECTION`)。
|
||||
|
||||
**SIS 未定义但 legacy 处理的子类型**:`ABTM`、`DELY`、`PADT`、`FTSS`、`STND`、`BDPB`、`REMC`。它们在 `XSD` 的 `FLOP` 段里是普通字段或集合,没有独立事件节;legacy 按 `STYP` 命中它们处理,说明真实流量可能存在 SIS 未记载的子类型。其报文形态与是否存在必须以真实报文确认(`Q8`),不得据 legacy 行为直接定案。
|
||||
|
||||
**SIS 定义但 legacy 无处理器**:`CHDT`、`FINT`、`MAXP`。
|
||||
|
||||
**未映射字段**:`XSD` `FLOP` 段中尚未解码的字段见 `G-FLOP-UNMAPPED`;其中 `FRET`、`FDIV`、`BDPB` 在 legacy 有对应处理,逐项必须在 `Q8` 对拍时定案(补齐映射或明确声明忽略),不得静默丢弃。
|
||||
|
||||
动态事件保留既有 `OPERATION_DAY`,也不基于接收时间重新推导它。航班不存在或已删除时按幂等成功处理——动态事件不创建航班(创建只发生在日计划与异常航班)。
|
||||
|
||||
### 12.3 删除与重建
|
||||
|
||||
@@ -451,7 +509,7 @@ ADFT 的字段缺失语义尚待上游确认。在确认前采用保守的 Set-o
|
||||
|
||||
主/共享航班级联:删除共享航班时重算主航班 `MAFL`(见「主/共享投影」)并向主航班通知;删除主航班时级联删除其子共享关联并发出删除通知;主/共享关系必须一次原子变更,不出现主已删、子残留的半状态。共享航班增量通常只更新并通知主航班,不直接发共享通知。这些语义同样约束 FDEL 之外的生命周期清理。主/共享关联的增删按 `FLID` 做值比较,不使用引用比较。
|
||||
|
||||
SIS 规定删除主航班时必须先删子共享航班、再删主航班,顺序不符时 RMS 应向 AODB 回发 EROR(`SIS:1.6.1-1.d`,事件定义见 `SIS:4.8`)。本章的原子级联不发该回报,两者取舍见 `C-25`。
|
||||
本章的原子级联不回发 EROR,与 SIS 的删除顺序要求相反;取舍见 `C-25`、`Q14`。
|
||||
|
||||
### 12.4 Kafka 与读取
|
||||
|
||||
@@ -464,3 +522,66 @@ SIS 规定删除主航班时必须先删子共享航班、再删主航班,顺
|
||||
### 12.5 生命周期
|
||||
|
||||
运营日过去不等于航班结束。历史清理须同时满足配置保留期与终态证据或足够静默期,先成功写入历史存储,后物理删除当前态;历史存储失败时必须删除零行(`D1`、`G-FLIGHT-HIST-RETENTION`)。
|
||||
|
||||
## 13. 静态参考数据
|
||||
|
||||
本章定义航班基础数据(参考主数据)的目标形态与合并语义。字段的值域、长度与业务含义以 [SIS 接口规范](legacy/SIS_AODB_RMS-V0.1.md) 对应节为准,本章只定义类别、结构与落库口径;取数路径与刷新责任见 [requirements.md](requirements.md) `US-13`/`US-14`。
|
||||
|
||||
### 13.1 来源
|
||||
|
||||
| 来源 | 权威节 | 形态 |
|
||||
|---|---|---|
|
||||
| AODB 参考数据事件 | `SIS:3.1`~`SIS:3.13` | `META.TYPE` 即类别码;`STYP` ∈ `DNLD` / `RESP` / `ADD` / `UPD` / `DEL` |
|
||||
| AODB 资源状态事件 | `SIS:3.14` | `TYPE=RSTA`;`STYP` 只有 `DNLD` / `RESP` |
|
||||
| AODB 应答参考数据请求 | `SIS:3.15` | 复用上表格式,仅 `STYP=RESP`;**没有请求 ID 或关联字段**,配对只靠子类型 |
|
||||
| admin-api 本地主数据 | 见 `US-13` | 21 类,清单与字段映射待 `Q8` 确认 |
|
||||
|
||||
同一类别可能由两条来源同时提供,覆盖优先级见 `US-13`。
|
||||
|
||||
### 13.2 类别
|
||||
|
||||
| `RTYPE` | 含义 | 唯一键 `RKEY` | 权威节 |
|
||||
|---|---|---|---|
|
||||
| `COUL` | 国家代码 | `COUC` | `SIS:3.1` |
|
||||
| `ARPT` | 机场代码 | `ITCD` | `SIS:3.2` |
|
||||
| `AIRL` | 航空公司代码 | `ITOP` | `SIS:3.3` |
|
||||
| `AIRC` | 机型代码 | `ITAT` | `SIS:3.4` |
|
||||
| `REGN` | 注册号 | `RNUM` | `SIS:3.5` |
|
||||
| `ORGN` | 机构代码 | `OGID` | `SIS:3.6` |
|
||||
| `FLTL` | 航班类型代码 | `FTYP` | `SIS:3.7` |
|
||||
| `TLST` | 航站楼代码 | `TCOD` | `SIS:3.8` |
|
||||
| `GLST` | 登机门代码 | `GCOD` | `SIS:3.9` |
|
||||
| `SLST` | 机位代码 | `SCOD` | `SIS:3.10` |
|
||||
| `CLST` | 值机柜台代码 | `CCOD` | `SIS:3.11` |
|
||||
| `BLST` | 行李转盘代码 | `BCOD` | `SIS:3.12` |
|
||||
| `CHLT` | 行李滑槽代码 | `CCOD` | `SIS:3.13` |
|
||||
| `RSTA` | 资源状态 | `RSID`(另存资源类型 `RTYP`) | `SIS:3.14` |
|
||||
|
||||
`CLST` 与 `CHLT` 复用同名标签 `CCOD`、`CNMC`、`CTML`、`CCAT`,语义不同,只能靠 `RTYPE` 区分。
|
||||
|
||||
### 13.3 结构与合并语义
|
||||
|
||||
`REF_MASTER` 一行一个 `(RTYPE, RKEY)`,字段名取 SIS 对应节的标签名,另存 `SOURCE`(`AODB` / `ADMINAPI`)、刷新批次与刷新时间。
|
||||
|
||||
- **list 模式 = 全量**:SIS 原文为一个 XML 含该类全部记录。整批校验通过后按类整体发布,失败不暴露半批(`US-13`)。
|
||||
- **incremental 模式 = 单条全字段**:报文只含被改动的一条,但该条含全部字段;按 `(RTYPE, RKEY)` 整体覆盖该行。
|
||||
- **删除只由 `STYP=DEL` 表达**:参考数据**没有字段级删除语义**——可选字段的空标签表示「数据不可用」,不是删除。这与航班动态的空标签语义相反,两者不得套用同一套合并规则。
|
||||
- `SRVT`、`VIPF` 与参考数据无关;参考数据不参与航班状态推进,也不进入 `MSG_EVENT`。
|
||||
|
||||
SIS 声明的上游忽略与截断口径(`SIS:3.2`/`SIS:3.4`/`SIS:3.5`/`SIS:3.6`/`SIS:3.7`/`SIS:3.8`/`SIS:3.10`/`SIS:3.11`/`SIS:3.12`):机场代码忽略 `ANAM`/`ACTY`/`ICCD`/`BDIS`/`ATYP`/`HAUL`;机型忽略 `DESC`/`CHAP`/`MFWT`/`MTWT`/`MHTM`/`MABR`;注册号忽略 `OWID`/`MFWT`/`MTWT`;机构忽略 `ONAM`,且 `OCAT` 只保留旅客/维护/地服代理;航班类型忽略 `FDES`/`FCML`/`CTYP`;航站楼忽略 `TNAM`/`TCAT`/`TPAX`;机位忽略 `STNM`/`MABS`/`FEPU` 并把 `STGP` 截断到 8 字符;值机柜台忽略 `CTNM`/`CCAT`;转盘忽略 `BTNM`/`BCAT`;国家代码只保留第一个 `REGC`。这些字段在未确认本地用途前不进入参考数据模型,需要时由 `US-13` 增补并说明用途。
|
||||
|
||||
### 13.4 资源状态
|
||||
|
||||
资源状态是「带时间窗的可用性事实」,按 `RTYPE=RSTA` 存入 `REF_MASTER`,`RTYP` 限定资源类型(`BELT` / `CNTR` / `GATE` / `STND`),`STAT` 取值 `E`(可用)/ `D`(不可用)。
|
||||
|
||||
- 资源**默认为可用**;只有禁用需要下发。
|
||||
- 禁用可带起止时间;**结束时间到达后自动恢复可用,不再补发启用消息**。
|
||||
- 结束时间缺失表示**一直禁用,直到该资源收到新的状态事件**。
|
||||
- 重新启用只带起始时间,不带结束时间。
|
||||
|
||||
### 13.5 机位与登机桥映射
|
||||
|
||||
- 机位主数据即 `SLST`(`RKEY=SCOD`),机位性质由 `REMT` 表达:`N` = 近机位(默认)、`Y` = 远机位、`A` = 停机区;所属航站楼是 `STML`。机位可用性由 `RSTA`(`RTYP=STND`)表达。
|
||||
- **机位→登机桥关系没有 SIS 来源**,只有 admin-api 提供;`US-14` 的映射因此依赖 admin-api 可用性,不可用时用最后可用版本。
|
||||
- 协议内的登机桥编码是 `ABTM` 元素中的 `ABDG`(`SIS:3.16`、`XSD` `OPT_BRIDGEDATA`),**不是航班主表标量**;legacy 另有一个由 admin-api 派生的航班级 `abdg`。目标形态必须在两者间二选一并写进「字段与集合」,确认前不得把派生值当成协议字段。
|
||||
- `PSDT` 的「空集合」与「未携带」含义不同:前者清空本地机位、后者保留原值(`INV-14`;空集合写法见「动态运行事件」)。
|
||||
|
||||
+16
-14
@@ -69,7 +69,7 @@
|
||||
4. `MALFORMED` 直接 `DEAD`;`CODEC_ERROR / UNSUPPORTED / INFRA` 按次数和退避处理,耗尽转 `DEAD(EXHAUSTED)`。不能无限重试未实现类型,也不能立即当非法报文丢弃。
|
||||
5. 终态判据只有尝试上限(`PARAM:msgx.pipeline.max-attempts`),**没有按时间的毒丸**;调度判断注入 `Clock`。人工重放的可重放范围以 `Q6` 决定的 `R_keep` 下界为准。
|
||||
6. 主泵在同一 PG 事务提交航班主表/明细、事件与处理结果;终态回填意图通过 `US-09` 同事务保存。任一步失败整体回滚;提交后只重试外部回填,不重复生成业务事件。
|
||||
7. 领域决策逻辑只读取当前完整态与已解码报文,返回下一完整态和待发事件,不执行 I/O;Processor 作为事务协调器,将状态写入、事件、处理终态与回填意图收敛在同一事务边界内,不直接触碰 Kafka。失败只在持有消息上下文的边界落账,中断向上传递,不作为普通失败吞掉。
|
||||
7. 决策、事务与落库的职责边界以 [implementation.md](implementation.md)「消息、身份与决策」与 `INV-17` 为准;本条验收面是:失败只在持有消息上下文的边界落账,中断向上传递,不作为普通失败吞掉。
|
||||
8. 权威存储不可用或未完成恢复时停止业务处理;不能把「整个状态丢失」误判为「单航班不存在」而批量成功结束增量报文。
|
||||
|
||||
**前置**:`US-01`;`Q1` 已定单库方向,`Q6` 决定 `R_keep` 下界(重放窗口)。数据库迁移只落自有库。
|
||||
@@ -92,12 +92,13 @@
|
||||
|
||||
**验收标准**
|
||||
|
||||
1. `SCHD-ADFT` 与 29 个 FLOP 子类型逐项列入覆盖矩阵,每项有对应的处理器规则与回归测试;未知类型可恢复失败。RESP/DNLD 不计入这批处理器,走 `US-06`。
|
||||
2. 每类固定「输入与前态 → 后态 → msg → schd → 终态」五面样例;区分字段缺失、显式清空、重复报文和主/共享航班。清单和 golden 样例按 `Q8` 补齐,不以「已写 29 个类」替代验收。
|
||||
1. 动态子类型的清单以 SIS `SIS:3.19`~`SIS:3.43` 为权威(25 类),逐类映射、空标签语义与方向约束见 [implementation.md](implementation.md)「动态运行事件」;每类必须有回归用例。legacy 的「29 类」计数与 SIS 的 25 类不是同一集合:SIS 未定义而 legacy 处理的 7 类、SIS 定义而 legacy 无处理器的 3 类,必须逐条列出并以真实报文确认(`Q8`)。校验与合并是同一套通用逻辑,逐类差异只体现在规则与用例上。未知类型可恢复失败。RESP/DNLD 不计入这批,走 `US-06`。
|
||||
2. 每类固定「输入与前态 → 目标字段/集合 → 空标签结果 → 终态与事件」样例;区分字段缺失、显式清空、撤销语义(如 `CNCL` 空标签是撤销而非清除)与重复报文。「空 = 清除」只适用于 SIS 逐类写明该语义的字段,不得统一套用。清单与 golden 样例按 `Q8` 补齐,不以「已写 29 个类」替代验收。
|
||||
3. 对按 KEEP 规则需忽略的不存在航班,以 `SUCCEEDED` 无副作用结束,并由 `US-09` 回填;ADFT 建航班等行为按各类型矩阵执行。航班当前态以自有 PG 为唯一权威,重启即恢复,不存在 Redis 全损后白名单无法找回的损坏路径。
|
||||
4. 共享航班更新与删除级联语义以 [implementation.md](implementation.md)「删除与重建」为规范(共享航班通知、主航班 `MAFL` 更新、级联删除、原子变更;不出现主已删、子残留);本条目验收实现不偏离该规范,目标不存在时幂等成功。
|
||||
5. ADFT/FDEL 的值相等比较与半状态禁止规则见 [implementation.md](implementation.md)「删除与重建」。
|
||||
6. PSDT 通过 `US-14` 的只读映射计算 `abdg`,处理器不直接调用 admin-api。
|
||||
7. 方向、截断与未映射字段以 SIS 为准:柜台、转盘、滑槽、登机门、计划机位五类的 AODB 方向报文必须拒绝(只从日计划快照接受);`ROUT` 只保留 4 条并忽略 `SCAT`/`SCDT`;XSD `FLOP` 段中当前未映射的字段必须显式列出并逐项定案(补齐映射或声明忽略),不得静默丢弃。
|
||||
|
||||
**前置**:`US-03`;PSDT 另依赖 `US-14`;`Q1`、`Q8`、`Q14`。
|
||||
|
||||
@@ -131,7 +132,7 @@
|
||||
2. `KAFKA:schd` 只通过 `flushSchd` 聚合,聚合周期与批上限见 reference;同一 FLID 取批内最新状态,成功确认覆盖对应原事件,失败保持批次可恢复并退避,耗尽可见为 `DEAD`。
|
||||
3. 外部接收成功、本地确认失败或进程重启后允许重发;事件标识跨重发稳定,消费者有去重约定,不宣称端到端恰好一次。
|
||||
4. 当前 `KAFKA:msg` 与 `KAFKA:schd` 的分区键均为 `FLID`,schd 逐 `FLID` 发送最新状态,不再是 legacy 的多航班数组。`msg` 是否需按 `SNDR` 分区、发送粒度与去重标识的放置以 `Q4` 定案为准;定案前不宣称单分区之外的顺序保证。
|
||||
5. 生产强制 `acks=all`、`enable.idempotence=true`、`max.in.flight.requests.per.connection=1`;Broker 支持幂等生产协议并完成实际验证,不允许非幂等降级通过验收。
|
||||
5. 生产强制 `D3` 的三项生产者约束(取值见 [reference.md](reference.md) 参数表);Broker 支持幂等生产协议并完成实际验证,不允许非幂等降级通过验收。
|
||||
6. 普通/聚合发送失败、确认丢失、批次标记中断和目标阻塞均有测试;DEAD 保留记录并告警。
|
||||
|
||||
**前置**:`US-03` 事件提交;`Q4`、现网 Broker 验证。wire 不兼容的标识字段不能直接加到现役载荷。
|
||||
@@ -206,16 +207,17 @@
|
||||
|
||||
**前置**:`Q1`、`Q3`;所查询的 `US-05`/`US-06` 状态发布能力。
|
||||
|
||||
### US-13 刷新 21 类参考主数据
|
||||
### US-13 刷新参考主数据
|
||||
|
||||
**目标**:业务使用来自 admin-api 的本地参考数据,刷新失败仍有上次可用版本。
|
||||
**目标**:业务使用来自 AODB 事件与 admin-api 的本地参考数据,刷新失败仍有上次可用版本。
|
||||
|
||||
**验收标准**
|
||||
|
||||
1. 按 `Q8` 的 21 类清单配置端点、RTYPE/RKEY、字段映射;这是独立于 `US-08` 的数据入口,不另建「参考专用第二 PG」。
|
||||
1. 覆盖 SIS `SIS:3.1`~`SIS:3.14` 的 13 类参考数据与资源状态(类别、`RTYPE`/`RKEY` 与结构见 [implementation.md](implementation.md)「静态参考数据」),以及 admin-api 的 21 类;两条来源的清单、字段映射与覆盖优先级按 `Q8` 确认。这是独立于 `US-08` 的数据入口,不另建「参考专用第二 PG」。
|
||||
2. 按 `(RTYPE,RKEY)` 幂等写 `REF_MASTER`,记录 SOURCE、刷新时间和批次;单类完整校验后发布,失败不暴露半批。
|
||||
3. 一类失败不破坏其他类或该类旧版本;同类由 AODB/admin-api 都提供时明确覆盖优先级,全量刷新时明确已删除项的处理,不能仅靠 SOURCE 日志解决冲突。
|
||||
4. 影子默认不主动刷新生产数据;需要参考样本时显式导入隔离副本。
|
||||
5. 入站按 `STYP` 区分全量与增量:全量报文按类整体发布,增量报文按 `(RTYPE,RKEY)` 整体覆盖,删除只由 `DEL` 表达;参考数据的空标签表示「数据不可用」而非删除,不得套用航班动态的空标签合并规则。
|
||||
|
||||
**前置**:admin-api 访问契约、`Q8`。可独立于消息处理器开发。
|
||||
|
||||
@@ -225,8 +227,8 @@
|
||||
|
||||
**验收标准**
|
||||
|
||||
1. 保留 `ORMS_STAND / ORMS_STAND_AIRBRIDGE` 两类,与 `US-13` 的 21 类分开统计;适配器拉取、完整校验后原子发布只读缓存。
|
||||
2. 近机位产生登机桥值,远机位或清空机位时 `abdg` 为空;一机位多桥、缺失映射与共享航班规则用 golden 固定。
|
||||
1. 机位主数据以 SIS `SLST` 为权威(机位性质取 `REMT`、可用性取 `RSTA`),登机桥关系只有 admin-api 来源(`ORMS_STAND / ORMS_STAND_AIRBRIDGE`),与 `US-13` 的类别分开统计;适配器拉取、完整校验后原子发布只读缓存。
|
||||
2. 近机位产生登机桥值,远机位或清空机位时为空;一机位多桥、缺失映射与共享航班规则用 golden 固定。**登机桥编码的落点必须先定案**:协议内它是 `ABTM` 元素的 `ABDG`,legacy 另派生一个航班级 `abdg`;定案前不得把派生值当成协议字段处理。
|
||||
3. admin-api 不可用时使用最后可用版本;无可用版本或映射不完整时明确失败,不用空映射冒充正常清空,也不发布半批。
|
||||
4. 处理器输入包含所需只读参考视图,不允许其直接 HTTP 或写缓存。
|
||||
|
||||
@@ -236,7 +238,7 @@
|
||||
|
||||
历史存储确认成功后,才允许删除对应实时航班;逐条隔离坏数据,不能删除写历史失败的集合。判史规则与保留期、业务时区、历史写入与删除事件之间的恢复协议需在启用前完成 golden 对拍。
|
||||
|
||||
阶段 A 不依赖 ES,不启用 `PROJECTION_REBUILD`。历史清理作业在历史存储未接通(或 `PARAM:msgx.history.history-store-enabled=false`)时删除 0 条;红线见 [implementation.md](implementation.md)「生命周期」。
|
||||
阶段 A 不依赖 ES,不启用 `PROJECTION_REBUILD`。历史清理作业在历史存储未接通(`PARAM:msgx.history.history-store-enabled` 关闭)时删除 0 条;红线见 [implementation.md](implementation.md)「生命周期」。
|
||||
|
||||
## 3. 运行与切流验收
|
||||
|
||||
@@ -259,16 +261,16 @@
|
||||
| `US-02` | 安全兼容注入,落信确认与业务完成分离 | `C-28`、`Q3`、`G-COMPAT-HTTP` |
|
||||
| `US-03` | 严格 FIFO、安全解码、身份去重、事务提交与持久重试 | `INV-3`、`INV-6`~`INV-10`、`INV-17`、`Q6`、`Q11`、`Q15` |
|
||||
| `US-04` | 忽略报文在身份绑定后无业务副作用终结并回填 | `INV-8`、`INV-9` |
|
||||
| `US-05` | ADFT、FDEL、29 类 FLOP、完整航班态及主/共享关系 | `INV-11`~`INV-22`、`Q8`、`Q13`、`Q14`、`Q16`、`G-FLOP-IDEMPOTENT`、`G-MAFL`、`G-SRVT-VIPF` |
|
||||
| `US-05` | ADFT、FDEL、SIS 25 类 FLOP、完整航班态及主/共享关系 | `INV-11`~`INV-22`、`Q8`、`Q13`、`Q14`、`Q16`、`G-FLOP-IDEMPOTENT`、`G-FLOP-DIRECTION`、`G-FLOP-UNMAPPED`、`G-MAFL`、`G-SRVT-VIPF` |
|
||||
| `US-06` | DNLD/RESP 整包快照、请求守卫、迟到应答隔离 | `INV-12`、`INV-15`、`INV-19`、`Q5`、`Q13`、`G-RESP-GUARD` |
|
||||
| `US-07` | Kafka 至少一次投递、同 `FLID` 保序、schd 聚合、失败与清理 | `D3`、`INV-10`、`C-29`、`Q4` |
|
||||
| `US-07` | Kafka 至少一次投递、同 `FLID` 保序、schd 聚合、失败与清理 | `D3`、`INV-10`、`C-29`、`Q4`、`G-DELIVERY-ORDER` |
|
||||
| `US-08` | 14 类 RQRD、1 类 RQFD、出站落信、开放请求唯一、匹配与超时 | `C-23`、`C-24`、`Q3`~`Q5`、`Q8`、`Q10`、`Q14`、`G-REQ-TRACK`、`G-REQ-OPEN-UNIQUE`、`G-REQ-TRACK-RETENTION` |
|
||||
| `US-09` | 终态回填意图、后台补偿、四结果、放弃与人工恢复 | `INV-7`、`INV-8`、`C-5`~`C-8`、`Q7`、`Q9`;`C-6` 不成立时闭合 `G-REPLAY-CHANNEL` |
|
||||
| `US-10` | 可查询、可预览、白名单重放、风险预检、授权与审计 | `CLM-3`、`Q6` |
|
||||
| `US-11` | 已了结终态归档、去重影子、竞态复查及独立保留期 | `D4`、`C-14`、`C-16`、`G-PROC-HST`、`G-HST-RETENTION` |
|
||||
| `US-12` | 从 PG 权威态查询实时主航班,固定契约且依赖失败不伪装为空 | `INV-11`、`Q3` |
|
||||
| `US-13` | 21 类参考主数据完整校验、原子发布、失败保旧 | `Q8` |
|
||||
| `US-14` | 机位/登机桥映射原子发布,PSDT 只读计算 | `Q8` |
|
||||
| `US-13` | SIS 13 类参考数据与资源状态、admin-api 21 类:完整校验、原子发布、失败保旧 | `Q8`、`G-REF-DATA` |
|
||||
| `US-14` | 机位/登机桥映射原子发布,PSDT 只读计算 | `Q8`、`G-REF-DATA` |
|
||||
| `US-15` | 阶段 B 历史归档成功后清场及删除事件恢复 | `D1`、`INV-18`、`Q9`、`G-FLIGHT-HIST-RETENTION` |
|
||||
| `OPS-1` | 真实适配器、配置与单写者拒启,失权停写,安全停机 | `D2`、`PRE-5` |
|
||||
| `OPS-2` | 真实健康、积压/失败指标、告警、受控处置与敏感信息保护 | reference.md |
|
||||
|
||||
+12
-4
@@ -13,6 +13,8 @@
|
||||
|
||||
编号稳定不变;条款被取代时标 `[作废 by C-y]` 并保留原文,不静默改写。不变量变更用「追加 + 作废」(`INV-7 → [作废 by INV-7b]`)。机制与领域规则见 [implementation.md](implementation.md),参数取值见 [reference.md](reference.md)。
|
||||
|
||||
**编号空缺**:本文件成形前已作废的旧条款未随迁移保留原文,其号码空缺且不再复用(契约段缺第 17~19 号,声明边界段缺第 1、2 号)。
|
||||
|
||||
## 1. 术语
|
||||
|
||||
| 术语 | 含义 |
|
||||
@@ -29,7 +31,7 @@
|
||||
|
||||
管道内部术语(`W`、队头、终态、回填意图)定义在 [implementation.md](implementation.md)「术语与持久化记录」。
|
||||
|
||||
条款状态词只有三种:`[待确认 Qn]`(未取得对方书面确认)、`[已确认 YYYY-MM-DD]`(对方书面确认且已回写)、`[我们单方承诺]`(不依赖对方,已生效)。
|
||||
条款状态词只有四种:`[待确认 Qn]`(未取得对方书面确认)、`[已确认 YYYY-MM-DD]`(对方书面确认且已回写)、`[我们单方承诺]`(对外承诺,不依赖对方,已生效)、`[我们自证]`(本系统自身的架构或部署事实,无需对方确认)。
|
||||
|
||||
## 2. 契约
|
||||
|
||||
@@ -136,7 +138,7 @@
|
||||
| CLM-4 | 回填不会被短暂故障放弃:最终打标,或进入可对账的放弃清单 | INV-8、`C-5`、`C-8` | **可声明(有条件)** | 条件:`R` 之前不放弃;`MISSING_ROW` 立即放弃并告警;放弃行须经人工对账才可用于清除判定(`C-8`)。原文保留另见 CLM-5 |
|
||||
| CLM-5 | 重放窗口内原文仍可读 | `C-6`、`C-7`、`Q7`、`Q9` | **不可** | 清除语义与保留期未确认;「打标即清除」下无补救 |
|
||||
| CLM-6 | 单实例内严格 FIFO | PRE-5、INV-3 | **可**(限于单活动实例) | — |
|
||||
| CLM-7 | 事件投递在同一 `FLID` 内保序 | INV-10、投递设计 | **可**(跨 `FLID` 不承诺) | 实现当前按目标级全序投递,收敛到按 `FLID` 属投递改造 |
|
||||
| CLM-7 | 事件投递在同一 `FLID` 内保序 | INV-10、投递设计 | **可**(跨 `FLID` 不承诺) | 只声明同一 `FLID` 内保序;按 `FLID` 的隔离边界与 `Q4` 定案、`G-DELIVERY-ORDER` 闭合一致 |
|
||||
| CLM-8 | 出站交付承诺只到「落信」 | `C-24`、`Q10` | **可**(仅落信语义) | 消费方与 ACK 列语义未确认 |
|
||||
| CLM-9 | 处理标记延迟由调度周期决定 | — | **不可** | 扫描周期不等于完成时限;批次积压、单行超时与历史作业都会延长实际延迟 |
|
||||
| CLM-10 | 容量量级假设(单实例、入站日消息量千级到万级、单报文 ≤ 10⁴ 字节) | — | **不可** | 未实测,无生产负载数据;解除条件:取得现役信箱日量、峰值与单报文上限后重估 |
|
||||
@@ -165,6 +167,8 @@
|
||||
| INV-11 | 权威唯一 | 需断言展示视图与缓存不得成为写入或对账来源 |
|
||||
| INV-12 / INV-13 | PG 事务失败、快照重复或迟到 | 整体回滚重试、不重复推进版本、不回退状态、不误删增量航班 |
|
||||
| INV-12 | 运营日冲突 | 整包 `DEAD(PROTOCOL)`,既有状态与版本不变 |
|
||||
| INV-14 | 未携带字段保留、显式清空才清除;集合按完整合并结果写入 | `FlightStateEngineTest`「day plan merges scalars overwriting overlaps retaining absent and clearing on explicit empty」「flop merge retains absent scalars and collections」;`FdelAndAdftProcessorTest`「ADFT merge does not clear absent scalars」 |
|
||||
| INV-14 | FLOP 逐类空标签语义(清除、撤销、集合清空)与「未携带不清空」的区分 | 逐类用例见 [implementation.md](implementation.md)「动态运行事件」;`G-FLOP-DIRECTION`、`G-FLOP-UNMAPPED` |
|
||||
| INV-15 | 缺席不删除 | 需分别断言 FDEL 与清理路径 |
|
||||
| INV-16 | 外部副作用失败后本地结果不变 | 需用例 |
|
||||
| INV-17 | 业务型终态四件套同事务 | 需真实 PG 用例 |
|
||||
@@ -178,7 +182,7 @@
|
||||
|
||||
上表首列是**引用**(`INV-x` 的定义见本文件「不变量」);同一行可覆盖多个 `INV`,例如 `INV-20 / CLM-3`。
|
||||
|
||||
声明边界的证据指针:`CLM-4` 断言放弃行不写标记、不被当作已打标;`CLM-9` 的指标已就位(`msgx.pipeline.job.heartbeat_age_seconds` / `ticks.total` / `failures.total` / `last_sweep_selected` 与 `msgx.pipeline.backfill.oldest_unmarked_seconds`),实际延迟仍需现场数据。
|
||||
声明边界的证据指针:`CLM-4` 断言放弃行不写标记、不被当作已打标;`CLM-9` 由作业心跳与回填年龄指标提供观测(指标名见 [reference.md](reference.md)「指标与健康」),实际延迟仍需现场数据。
|
||||
|
||||
## 7. 当前已知偏差
|
||||
|
||||
@@ -198,6 +202,10 @@
|
||||
| `G-HST-RETENTION` | 归档目标(`PROC_STATE_HST` 及后续归档表)的保留期与清除作业未定义 | 归档只转移不减少容量占用;`G-PROC-HST` |
|
||||
| `G-FLIGHT-HIST-RETENTION` | 航班历史存储(外部)的保留期与容量上限未定义 | `D1`;`FLIGHT_SCHD` 物理清除后历史存储是唯一副本 |
|
||||
| `G-REQ-TRACK-RETENTION` | `REQ_TRACK` 关闭态行(`DONE`/`EXPIRED`)的保留期与清除作业未定义 | 自有 PG 无界增长;`US-08` |
|
||||
| `G-DELIVERY-ORDER` | 投递按目标级全序推进:一个 `FLID` 的队头失败会阻塞同目标其他 `FLID`,尚未收敛到按 `FLID` 隔离的保序边界 | 投递吞吐;`CLM-7`、`C-29` |
|
||||
| `G-FLOP-DIRECTION` | 柜台、转盘、滑槽、登机门、计划机位五类的 FLOP 报文按 AODB→RMS 接收并落库,SIS 要求收到即拒绝(这些资源在 AODB 方向只随日计划下发) | `US-05`;`SIS:3.24`、`SIS:3.25`、`SIS:3.26`、`SIS:3.34`、`SIS:3.38` |
|
||||
| `G-FLOP-UNMAPPED` | `XSD` `FLOP` 段的 `FFID`、`UNCL`、`CKOP`、`GTOP`、`CKCL`、`BDOP`、`LCTM`、`BDCL`、`FRET`、`FDIV`、`FLAB`、`RUNW`、`PXNO`、`FLBG`、`CKPB`、`BDPB` 未解码,解码即丢弃;其中 `FRET`、`FDIV`、`BDPB` 在 legacy 有对应处理 | `US-05`;无损字段保存 |
|
||||
| `G-REF-DATA` | 参考数据入站(`SIS:3.1`~`SIS:3.14`)与 admin-api 刷新均未实现,`REF_MASTER` 只有目标表定义 | `US-13`、`US-14` |
|
||||
|
||||
## 8. 待确认事项台账
|
||||
|
||||
@@ -210,7 +218,7 @@
|
||||
| Q5 | 请求匹配:回显字段可靠性与降级匹配 | `RQFD` 60 秒 / `RQRD` 30 秒超时 | 请求跟踪闭环 | 未确认 |
|
||||
| Q6 | 重放期限与人工处置期限的取值(唯一作用是决定 `R_keep` 下界) | `R` = 30 天;重放/处置期限未定 | `R_keep` 取值 | 未确认 |
|
||||
| Q7 | 处理标记值集与写权限、原文保留期、处理时间语义 | 写入 `PROCESSED` | 回填值集、保留期下界 | 未确认 |
|
||||
| Q8 | 逐类覆盖清单(积压摸底的类型分布依据) | — | 积压处置与逐类矩阵 | 暂缓(现阶段不处理) |
|
||||
| Q8 | 逐类覆盖清单:真实报文的子类型分布、SIS 未定义的 legacy 子类型(`ABTM`/`DELY`/`PADT`/`FTSS`/`STND`/`BDPB`/`REMC`)的报文形态、admin-api 21 类清单与字段映射、逐类 golden | 航班动态的字段语义与空标签规则已由 SIS `SIS:3.19`~`SIS:3.43` 给出,参考数据类别由 `SIS:3.1`~`SIS:3.14` 给出;`VIPP` 的忽略口径 SIS 未写明 | 积压处置与逐类矩阵的差异标注 | 暂缓(现阶段不处理) |
|
||||
| Q9 | 清除执行方与 DDL 授权、方案 A/B 选型、分区能力 | 首选方案 A | `R_keep` 与清除边界 | 未确认 |
|
||||
| Q10 | 出站消费方、ACK 列语义、出站清理与去重契约 | — | 出站信箱 | 未确认 |
|
||||
| Q11 | 上游 `SEQN` 重置周期与业务身份的日期边界 | 不含日期边界 | 身份算法 | 未确认 |
|
||||
|
||||
Reference in New Issue
Block a user