refactor(storage): ACM2-12 落地——自有 PostgreSQL 全内部状态,共享 MySQL 仅信箱

按 ACM2-12 定案把仓库存储口径从"MySQL 六辅助表"推进到最终形态:
- 迁移:删除 MySQL V2.0.0 六表脚本,新增自有 PG V1.0.0
  (PROC_STATE/MSG_EVENT/PUMP_JOB/REQ_TRACK/REF_MASTER,PG 方言,REQ_TRACK.COUTMSGS_ID
  按 U18 修为 BIGINT;FLIGHT_STATE 阶段 B 缓做不建表)。
- 配置:datasources.default = 自有 PostgreSQL(enabled=false 待 U05);
  移除 datasources.reference/flyway.reference;新增 mailbox.shared-mysql(共享信箱,
  仅 DML,不建表);test profile 显式启用 H2 内存 datasource。
- 接口/注释:Repositories KDoc 按 ACM2-12 归属(自有 PG / 信箱封装 / gen→Redis 占位 /
  FLIGHT_STATE 缓做);InboxService、Pump 事务模型注释对正
  (信箱外部副作用 + PG 本地事务 + 回填最终一致)。
- 文档:architecture §1/§2/§3/§4/§5(D1/D2)/§6/§7/§8、design §1/§2/§3.1/§3.4/§3.5/§6/§9、
  README 全部按 ACM2-12 收口(自有 PG + 共享信箱 + Redis 动态/gen + 阶段 B 缓做)。

验证:37 测试全绿;dev stub 冒烟仍可启动、/health UP、收报 200。
信箱适配层(CminmsgMailbox/OutboxMailbox)、gen→Redis Lua、作业窗口语义、影子重设计
属 ACM2-12 Checks ②③④⑤(U05/U09 批次)。
This commit is contained in:
windyboy
2026-09-07 08:21:11 +08:00
parent a3f1da4bcc
commit e0ce863905
10 changed files with 280 additions and 235 deletions
+35 -31
View File
@@ -1,9 +1,10 @@
# msgexchange-v2(新一代消息交换服务)
依据 **ACMA-8 v4 综合架构**(单写者严格 FIFO 管道 + 两阶段权威)与 **ACMA-6 技术选型**
Micronaut 5.1 + Kotlin 2.3)搭建的新一代消息交换服务工程。本仓库独立于 legacy
`msgexchange-api`Java 8 / Spring Boot 1.5 / Maven)——过渡期两套系统并存(影子对拍→
切流→旧仓库冻结),legacy 维护不受本仓库影响。
依据 **ACMA-8 v4 综合架构**(单写者严格 FIFO 管道)与 **ACMA-6 技术选型**
Micronaut 5.1 + Kotlin 2.3)搭建的新一代消息交换服务工程**存储边界与阶段 B 按
ACM2-11/ACM2-12 定案**(自有 PostgreSQL 全内部状态 + 共享 MySQL 仅信箱 + Redis 动态/gen
阶段 B 缓做)。本仓库独立于 legacy `msgexchange-api`Java 8 / Spring Boot 1.5 / Maven)——
过渡期两套系统并存(影子对拍→切流→旧仓库冻结),legacy 维护不受本仓库影响。
> **JDK 口径实测修正**Micronaut 5.1 系构件(如 micronaut-http-server-netty:5.1.10
> 要求 JVM 25+,计划原定 JDK 21 不可行;工程已按 **JDK 25** 配置(ACMA-9 记录)。
@@ -12,7 +13,7 @@
| 包 | 职责 | 对应 ACMA-8 |
|---|---|---|
| `ingress/` | Ingress & Inbox接收事务(事务1),不解析报文 | 流程 1,I3 |
| `ingress/` | Ingress & Inbox收报(共享信箱落信 → 自有 PG 入队,ACM2-12),不解析报文 | 流程 1,I3 |
| `processing/` | Processing 主泵:严格 FIFO 领取、identity 绑定、纯函数决策、事务2 | 流程 2/4I1/I2/I5 |
| `delivery/` | Delivery & Projection:每 target 严格 FIFO 投递、schd 聚合 | 流程 3 |
| `reference/` | Reference & Query21 类同步 + 15 类请求状态机 | 流程 6 |
@@ -25,13 +26,14 @@
- `SIS_AODB_RMS-V0.1.md` + `doc/unisysaodbsis.xsd`:**消息结构唯一事实源**(wire 契约冻结,
自 legacy 仓库复制以自包含;codec 实装依据,ACM2-2/ACM2-3)。
- `db/migration/V2.0.0__aux_tables.sql`:六表 DDLPROC_STATE / MSG_EVENT / REF_DATA /
REQ_TRACK / PUMP_JOB / FLIGHT_STATE),与 ACMA-8 v4 数据模型节逐字一致;影子实例在
独立 schema 执行同一脚本。**ACM2-11 拆分**21 类静态主数据迁独立 PostgreSQL 参考库
`datasources.reference`,见 design.md §2);`REF_DATA` 留守 SCHD_GEN 行(流程 4 gen CAS)。
- `lua/snapshot_replace.lua`:同一 hash 原子“覆盖新代 + 按代差删”(流程 4,I4/I5)。
- `db/migration/V1.0.0__own_pg_pipeline.sql`**自有 PostgreSQL**(唯一自有库)表结构
PROC_STATE / MSG_EVENT / PUMP_JOB / REQ_TRACK / REF_MASTERPG 方言),ACM2-12 定案;
共享 MySQLCMINMSGS/COUTMSGS)仅信箱 DML 不建表;快照 gen 与航班动态在 Redis。
- `lua/snapshot_replace.lua`:同一 hash 原子“覆盖新代 + 按代差删”(流程 4,I4/I5;
随 gen→Redis 协议(U09)扩展版本推进)。
- `lua/batch_delete.lua`:3:30 清场批量删除(仅 ES 写成功集,I4)。
- `application.yml`:口令全部环境变量外置(零入库);`msgx.phase` 为阶段 A/B 总开关;
- `application.yml`:口令全部环境变量外置(零入库);`datasources.default`=自有 PGenabled=false
待 U05)、`mailbox.shared-mysql`=共享信箱;`msgx.phase` 权威口径(A 现役;B 缓做);
pipeline 参数 = ACMA-8 参数表初值。
## 未完成(按计划属于后续阶段,不是本脚手架遗漏)
@@ -41,27 +43,28 @@
阶段 1 后续项。
3. **依赖版本锁定**`gradle/libs.versions.toml` 中版本为计划口径,需阶段 0
「Micronaut×现网 Eureka 互操作冒烟 + logstash + ES REST」通过后固化。
4. **仓储实装**`infra/persistence/Repositories.kt` 目前是接口Micronaut Data JDBC
实装属阶段 1 后续),主泵/调度循环以接口驱动,纯逻辑已抽离可单测。
5. **21 类静态主数据参考库**ACM2-11):独立 PostgreSQL`datasources.reference` /
`StaticRefRepository`)已占位(enabled=false),表结构/迁移/同步实装属阶段 6。
4. **自有 PG 数据层实装**ACM2-12`infra/persistence/Repositories.kt` 目前是接口
Micronaut Data JDBC on PG + 信箱适配层 CminmsgMailbox/OutboxMailbox 属 U05 批次),
主泵/调度循环以接口驱动,纯逻辑已抽离可单测。
5. **信箱适配层与共享库边界**ACM2-12):CMINMSGS 收 / COUTMSGS 出为共享 MySQL 仅 DML
mailbox.shared-mysql 配置段已占位);收报「信箱落信 → PG 入队」与处理回填的
外部副作用/补偿模型属 U05 批次。
## 数据库初始化(U04/R01,务必先读
## 数据库初始化(ACM2-12 口径
`db/migration/V2.0.0__aux_tables.sql` **只建六张辅助表**PROC_STATE / MSG_EVENT / REF_DATA /
REQ_TRACK / PUMP_JOB / FLIGHT_STATE),并假定 `CMINMSGS`(及其历史表)等 legacy 旧表已存在——
迁移集是「现网 legacy 库的演进」而非「全新库初始化」。因此:
**自有 PostgreSQL**(唯一自有库):`db/migration/V1.0.0__own_pg_pipeline.sql`
PROC_STATE / MSG_EVENT / PUMP_JOB / REQ_TRACK / REF_MASTERPG 方言)。全新库直接执行即可,
legacy 前置。
- **现网/影子演进**:在既有 `cdairport` 库(含 CMINMSGS)上执行即可,Flyway 会补跑 V2.0.0。
- **全新空库(本机/CI/演练/灾备重建)**:需先按 legacy 仓库(`airport_chengdu_msgexchange_api`
建好 CMINMSGS/CMINMSGS_HST/COUTMSGS 等旧表(或从现网导出 schema),再启动本服务;否则
收报第一句 SQL 即报「表不存在」。影子实例在独立 schema 执行同一脚本时同样先建旧表。
- 为什么没有 CMINMSGS 的 V1 迁移:六表之外的旧 schema 归 legacy 仓库维护(冻结期),
本仓库不重复声明;若未来要求空库一键初始化,再补 V1 基线快照(见 ACM2-10 U04
- 21 类静态主数据(航空公司/航线/机位等)走**独立 PostgreSQL 参考库**ACM2-11):
`application.yml``datasources.reference` 默认 `enabled=false`,阶段 6 实装时置 true
并设 `MSGX_REF_DB_URL`(参考库迁移目录 `db/ref-migration`);与业务 MySQL 库(六表+legacy
和 Redis 航班动态互不干扰。
**共享 MySQLcdairport,他人系统库)**:本系统**不建表/schema**,仅信箱 DML——收报写
`CMINMSGS`、出站写 `COUTMSGS`(他人读取发送);表结构与保留策略归库方管理。收报前需确认
共享库 CMINMSGS 已存在(他人系统提供);本仓库不声明其 schema。
- **事务模型**:与共享库交互均为外部副作用(ACM2-12)——收报=信箱落信成功(返回
CMINMSGS_ID)→ 自有 PG 建 PENDING 入队;处理成功回填 DATE_PROCESSED/STATUS 为最终一致
- **快照 gen**:随航班动态同在 Redisgen→Redis 协议属 U09,当前为过渡占位)。
- **阶段 BFLIGHT_STATE**:缓做不落表。
- 影子对拍:自有 PG 开独立 schema;共享信箱为单信箱无法双写,影子输入=只读水位/回放口径。
## 构建
@@ -97,5 +100,6 @@ MICRONAUT_ENVIRONMENTS=dev ./gradlew run # dev stub 冒烟:内存 stub,无
## 关联
Plane `airport_chengdu_msgexchange_api`**ACM2 为现行入口**):ACM2-3(综合架构 v4
架构权威)、ACM2-4(脚手架跟踪)、ACM2-10(评审与实施计划 U01U30);ACMA 系列仅作
归档历史/迁移来源(ACMA-8 v4 / ACMA-6 选型 / ACMA-9 JDK 口径在归档中可溯)。
架构权威,存储边界按 ACM2-11/12 修订)、ACM2-4(脚手架跟踪)、ACM2-10(评审与实施计划
U01U30)、ACM2-11/12(存储边界与共享信箱决策);ACMA 系列仅作归档历史/迁移来源
ACMA-8 v4 / ACMA-6 选型 / ACMA-9 JDK 口径在归档中可溯)。