Files
msgexchange-v2/docs/architecture.md
T
windyboy f3b791712b docs: 统一术语、收紧需求验收范围、修正 Q3 归属
- "自有业务数据库" → "自有 PG",与 specification/architecture 统一
- US-05 AC1 钉死现场 7 类子类型,白名单其余待 Q3 确认后增补
- US-05 AC3 恢复未映射字段唯一键(信箱编号+路径+出现序号)
- US-09 AC1 恢复旧请求作废可观察约束
- implementation.md VIPP/未映射字段去掉误引 Q3(不在 Q3 范围)
- 精简 architecture/requirements 系统定位复述与实现机制泄漏
2026-09-20 09:30:01 +08:00

86 lines
5.8 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.
# 架构
本文写架构约束与归属;旧版报文的格式兼容以 [SIS 接口规范](legacy/SIS_AODB_RMS-V0.1.md) 和 [XSD](legacy/unisysaodbsis.xsd) 为依据。
## 1. 系统定位与范围
msgexchange-v2 替换旧版 `msgexchange-api`,承接 OMMS H5 查询系统的消息网关职责。
## 2. 总体架构
```text
CIIMS adapter(把 AODB 下发的 XML 写入信箱)
│ 落信
共享 MySQLCMINMSGS(入站信箱)
──────── msgexchange-v2(单活动实例) ────────
ingress 收报 processing 处理(流程见「主流程」)
delivery 投递 jobs 作业:回填 / 出站重试 / 历史清理 / 记录清理
──────────────────────────────────────────────
├─▶ Kafkamsg / schd ── 运营航班显示界面
├─▶ Redis:航班查询投影
├─▶ 共享 MySQL:COUTMSGS ── 参考数据与日计划请求发 AODB
├─▶ Elasticsearch:航班历史
└─▶ 自有 PostgreSQL:航班当前态 / 管道与未映射字段记录 / 静态参考数据 ── admin-api 只读参考数据
```
跨阶段的待办与处理进度持久化在自有 PG,重启后从记录继续(`US-01` AC4、`US-03` AC3、`US-10` AC2)。
技术栈:Kotlin + JDK 25、Micronaut 编译期依赖注入、JDBC 持久化;数据库变更由 Flyway 管理,只作用于自有 PostgreSQL。依赖版本见 `build.gradle.kts`
## 3. 模块职责
| 模块 | 职责与边界 |
|---|---|
| `ingress` | 轮询信箱、登记入队、兼容入口落信(`US-01``US-02`);不解析业务报文。 |
| `codec` | XML 解码,区分非法报文与可修复的解码失败(`US-03`)。 |
| `processing` | FIFO 调度、业务身份绑定与去重、领域决策与落库(`SCHD`/`FLOP`/`FDEL`/`ADFT`/静态参考数据),航班类写 Redis 投影,未落到航班当前态的字段写 `UNMAPPED_FIELD`。 |
| `delivery` | 读待发事件投 Kafka,聚合 `schd`,失败后重试(`US-08``C-9`)。 |
| `jobs` | 回填、出站重试、航班历史与到期记录清理;不占主泵 FIFO(`US-10``US-11``US-14`)。 |
| `domain` / `config` | 领域状态、事件和决策模型,以及运行参数。 |
| `infra` | 仓储(JDBC/stub)、外部适配器(共享信箱、Kafka、Redis、航班历史存储、AODB 出站)、重试、健康检查与日志;对其他模块只暴露接口。 |
## 4. 主流程
航班动态消息走满全链,其余类别只换其中几步:
1. **收报**:按「处理时间为空」发现信箱行,登记入队(`INV-1`)。
2. **主泵**:按最小未完成 `MSG_ID` 取队头,解码,按业务身份去重(`US-03` AC1implementation「消息、身份与决策」);非法或不支持的报文无副作用,终态留档(`US-03`)。
3. **事务一**:持 `PIPELINE_LOCK`,领域变更、未映射字段记录与待发事件一起提交。
4. **投影**:写 Redis,写成功才算处理完成(`INV-10`);失败保持未完成、下轮重写投影,业务效果幂等(`US-03` AC3)。
5. **事务二**:处理终态与回填意图一起提交。
6. **回填**:作业把处理标记写回共享信箱(`US-10`);写不上的记录在案并告警。
7. **投递**:读待发事件发 `KAFKA:msg` / `KAFKA:schd`,至少一次(`C-9`);一直失败的记录保留可查并告警(`US-08`)。
其余类别与这条主干的差异:
| 类别 | 与主干的差异 | 完成判据 | 失败时 |
|---|---|---|---|
| 日计划(`DNLD`/`RESP`) | 第 3 步改为每批一个事务,第 5 步在整包完成后 | 整包成功,含 Redis 刷新(`US-07` AC4/AC5) | 不标记已处理,下轮整包重处理(`US-07` AC4 |
| 静态参考数据 | 无第 4 步;一个事务完成落库、终态与回填意图 | 该类落库成功(`US-13` AC1) | 校验不过整类不动,其他类照常(`US-13` AC2 |
| 出站请求 | 不走收报队列:登记新请求并作废同子类型旧请求;`RQRD``RQFD` 各自最多一条在途,后续请求待前一条结案再写入 `COUTMSGS` | 请求已写入信箱(`US-09` AC1 | `jobs``REQ_TRACK` 重试仍有效且确认未落信的请求;写入结果不明时记录并告警,不直接重发;交付承诺只到落信(`C-4` |
| 航班历史清理(作业) | 不走消息队列:历史写入成功后物理删除 | 实时数据已删(`US-14` AC3) | 历史写不成功不删,下轮重来(`US-14` AC3 |
## 5. 数据归属与一致性
| 存储 | 承载内容 | 职责说明 |
|---|---|---|
| 自有 PostgreSQL | 消息处理状态、回填意图、待发事件、出站请求状态、航班当前态、未映射字段与静态参考数据 | 航班当前态的唯一权威;本地事务只覆盖此库(`INV-5`)。 |
| Redis | 航班查询投影 | 由本系统根据 PG 当前态维护;不存处理状态(`INV-11`)。 |
| 共享 MySQL | 入站与出站信箱 | 外部邮箱边界;不改表结构,出站交付止于落信(`C-2``C-4`)。 |
| Elasticsearch | 已结束航班的历史 | 历史写入成功后才删除实时航班(`D1`)。 |
跨存储步骤不能并入 PG 事务,由持久意图与幂等重试衔接;具体分段见「主流程」。
## 6. 关键决策
以下决策补充主流程的跨存储边界。
| 编号 | 决策及理由 | 证据 / 偏差 |
|---|---|---|
| D1 | FDEL 的航班状态变更与待发删除事件同一事务提交;历史清理先确认历史写入成功,必要时登记待发删除事件,再物理删除。 | `US-06` AC1、`US-14` AC3 |
| D2 | `msg` 单分区投递;同一 `FLID` 按事件顺序发送,队头失败时暂停该航班的后续事件。生产端须保持发送顺序,重发可能重复。 | `US-08` AC2、`CLM-3``C-9` |