diff --git a/docs/architecture.md b/docs/architecture.md index 7d30063..e473611 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,12 +1,12 @@ # 架构 -本文写架构约束与归属,不代表能力已实现;上线与切流的操作步骤另立规程。旧版报文的格式兼容以 [SIS 接口规范](legacy/SIS_AODB_RMS-V0.1.md) 和 [XSD](legacy/unisysaodbsis.xsd) 为依据。 +本文写架构约束与归属;旧版报文的格式兼容以 [SIS 接口规范](legacy/SIS_AODB_RMS-V0.1.md) 和 [XSD](legacy/unisysaodbsis.xsd) 为依据。 ## 1. 系统定位与范围 -msgexchange-v2 是 OMMS H5 查询系统的消息网关,替换旧版 `msgexchange-api`,收取 CIIMS adapter 信箱中 AODB 下发的 XML 报文:航班动态写入业务数据库、写 Redis 投影供页面查询,并经 Kafka 通知运营航班显示界面;静态参考数据(机场、航空公司、机型、机位等 13 类基础数据与资源状态)写入独立数据表。 +msgexchange-v2 替换旧版 `msgexchange-api`,是 OMMS H5 查询系统的消息网关。 -功能需求是 [requirements.md](requirements.md) 的十四条用户故事(采集、处理、投递、查询、维护,`US-01`~`US-14`),运行需求是四条验收(单实例、可观测、测试隔离、切换回退,`OPS-1`~`OPS-4`)。不生成航班/业务数据类报文,不替代 CIIMS/AODB,不调用 admin-api;完整非目标见同文件「范围与非目标」。 +功能需求是 [requirements.md](requirements.md) 的十四条用户故事(采集、处理、投递、查询、维护,`US-01`~`US-14`),运行需求是四条验收(单实例、可观测、测试隔离、切换回退,`OPS-1`~`OPS-4`);完整非目标见同文件「范围与非目标」。 - **主要入口**:轮询共享 MySQL 入站表 `CMINMSGS`,只取处理时间为空的行,按编号升序、每批有上限(`US-01`;`INV-1`)。 - **兼容入口**:`POST /cminmsgs/send` 供联调工具把报文写进信箱,与上游投递走同一条处理路径;返回的编号只表示已进信箱,不代表已处理或下游已收到(`US-02`)。 @@ -16,8 +16,6 @@ msgexchange-v2 是 OMMS H5 查询系统的消息网关,替换旧版 `msgexchan - **权威**:航班当前态的权威是自有 PostgreSQL(`FLIGHT_SCHD`、资源明细表、`FLIGHT_ROUTE_POINT`);信箱、Redis、Kafka、展示视图都不是(`INV-5`)。 - **航班历史**:已结束航班先写入 Elasticsearch 历史库,成功后才从实时数据删除(`US-14`;`D1`)。 -测试环境用 PostgreSQL;生产环境用 PostgreSQL 还是 Oracle 11g 尚未确定,Oracle 适配验证通过前不作支持承诺(生产库选型见 `Q14`)。 - ## 2. 总体架构 ```text @@ -41,9 +39,9 @@ delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 / 四组线程在同一进程、互不调用,协作只经自有 PG 的持久记录交接;HTTP 接口走事件循环,不占这四组线程。重启后各段从记录接着做,不依赖内存进度(`US-01` AC4、`US-03` AC3、`US-10` AC2)。 -线程之间不加锁,靠幂等写入:收报按信箱编号只登记一次(`US-01` AC2)、回填只写空标记(`INV-2`)、记录清理只删已回填且超过保留期的行(`US-11`);发生竞争时后到的操作复查状态并重试。主泵与航班历史清理对实时航班表的互斥是实现手段,用以落实「正在被消息处理的航班跳过」(`US-14` AC4)。 +线程之间不加锁,靠幂等写入:收报按信箱编号只登记一次(`US-01` AC2)、回填只写空标记(`INV-2`)、记录清理只删已回填且超过保留期的行(`US-11`)。 -运行边界:同一时刻只允许一个实例处理消息(`OPS-1`);切换与回退以信箱处理标记交接,本系统内部处理和回填进度保存在自有 PG 的 `PROC_STATE`,停旧启新时未处理的消息由旧系统继续(`OPS-4`);积压、处理失败、投递失败、回填失败各有指标与告警(`OPS-2`)。 +运行边界:切换与回退以信箱处理标记交接,内部处理与回填进度保存在自有 PG 的 `PROC_STATE`(`OPS-4`)。 技术栈:Kotlin + JDK 25、Micronaut 编译期依赖注入、JDBC 持久化;数据库变更由 Flyway 管理,只作用于自有 PostgreSQL。依赖版本见 `build.gradle.kts`。 @@ -76,12 +74,10 @@ delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 / | 类别 | 与主干的差异 | 完成判据 | 失败时 | |---|---|---|---| | 日计划(`DNLD`/`RESP`) | 第 3 步改为每批一个事务,第 5 步在整包完成后 | 整包成功,含 Redis 刷新(`US-07` AC4/AC5) | 不标记已处理,下轮整包重处理(`US-07` AC4) | -| 静态参考数据 | 无第 4 步;一个事务完成落库、终态与回填意图 | 该类落库成功(`US-13` AC1/AC5) | 校验不过整类不动,其他类照常(`US-13` AC2) | +| 静态参考数据 | 无第 4 步;一个事务完成落库、终态与回填意图 | 该类落库成功(`US-13` AC1) | 校验不过整类不动,其他类照常(`US-13` AC2) | | 出站请求 | 不走收报队列:登记新请求并作废同子类型旧请求;`RQRD` 与 `RQFD` 各自最多一条在途,后续请求待前一条结案再写入 `COUTMSGS` | 请求已写入信箱(`US-09` AC1) | `jobs` 按 `REQ_TRACK` 重试仍有效且确认未落信的请求;写入结果不明时记录并告警,不直接重发;交付承诺只到落信(`C-4`) | | 航班历史清理(作业) | 不走消息队列:历史写入成功后物理删除 | 实时数据已删(`US-14` AC3) | 历史写不成功不删,下轮重来(`US-14` AC3) | -出站的后半程:应答按报文类型匹配等待中的请求,发错或迟到的不更新数据、记录后跳过;超过时限未等到应答,标记超时;`EROR` 定位到本系统发出的请求,标记失败并告警(`US-09`)。 - ## 5. 必须保持的约束 以下约束不得违反: diff --git a/docs/requirements.md b/docs/requirements.md index 887fcc9..12475de 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -100,7 +100,7 @@ | 报文 | 说明 | |---|---| -| `SCHD-DNLD` | AODB 主动下发,直接处理。 | +| `SCHD-DNLD` | AODB 主动下发,无需匹配在途请求。 | | `SCHD-RESP` | 本系统请求后的应答,只在请求未过期时生效;迟到的应答不更新数据。 | **验收标准** diff --git a/docs/specification.md b/docs/specification.md index e15c4bc..a719870 100644 --- a/docs/specification.md +++ b/docs/specification.md @@ -190,7 +190,7 @@ | INV-10 | `US-05` AC4、`US-06` AC1 | 投影写失败的消息下轮仍被处理 | | INV-11 | `US-12` AC1/AC2 | 返回全部非共享航班,且与 Redis 一致;Redis 故障时返回错误 | | US-11 | `US-11` AC1/AC2 | 未完成的记录不被删除 | -| US-13 | `US-13` AC1~AC5 | 全量整体替换、增删改逐条;空值是「没有值」不是删除;一类校验失败只停该类;参考数据落独立表供 admin-api 只读(`C-10`) | +| US-13 | `US-13` AC1~AC4 | 全量整体替换、增删改逐条;空值是「没有值」不是删除;一类校验失败只停该类;参考数据落独立表供 admin-api 只读(`C-10`) | | US-10 AC2 | `US-10` AC2 | 写失败重试与告警可观测 | | CLM-4(止于落信) | `US-09` AC1~AC3 | 出站请求写入 `COUTMSGS` | | CLM-5(不承诺完成时限) | — | 需求未定完成时限;现场一般为即时处理 |