refine aodb high-level design and planning docs
This commit is contained in:
@@ -1,448 +1,515 @@
|
||||
# 开源机场运营数据库(AODB)初步高层设计
|
||||
# 开源机场运营数据库(AODB)高层设计文档
|
||||
|
||||
## 1. 目标
|
||||
|
||||
本设计给出 AODB 的初步高层方案,重点回答三件事:
|
||||
本设计给出 AODB 的首期可开工高层方案,重点回答六件事:
|
||||
|
||||
1. 系统由哪些核心模块组成。
|
||||
2. 关键业务数据如何流转。
|
||||
3. 首期上线应覆盖哪些能力。
|
||||
1. 首期上线到底做什么、不做什么。
|
||||
2. 系统由哪些核心聚合和服务组成。
|
||||
3. 关键业务数据如何在“观测、裁决、发布事实”之间流转。
|
||||
4. 资源分配、冲突、告警和人工复核如何闭环。
|
||||
5. 对外查询与事件订阅如何解耦。
|
||||
6. SLO 与部署、容灾和审计如何对齐。
|
||||
|
||||
适用范围:年旅客吞吐量 500 万至 3000 万机场。
|
||||
适用范围:年旅客吞吐量 500 万至 3000 万机场,单机场优先。
|
||||
|
||||
## 2. 设计原则
|
||||
|
||||
- 单一事实源(SSOT):航班与资源状态统一归口到 AODB。
|
||||
- 事件驱动:状态变化通过事件广播,减少系统耦合。
|
||||
- 标准优先:优先兼容 AIDX、SSIM、AFTN/SITA。
|
||||
- 渐进建设:先实现核心闭环,再扩展高级能力。
|
||||
- 单一事实源:AODB 对外只发布单一当前权威事实,不暴露“谁最后写入”式伪一致。
|
||||
- 事实分层:原始观测、裁决记录、发布事实必须分层建模。
|
||||
- 事件驱动:状态变化通过事件传播,系统间通过契约解耦。
|
||||
- 规则可解释:字段权威、冲突裁决、人工覆盖都必须能解释来源和原因。
|
||||
- 渐进建设:先做稳定闭环,再引入预测、CEP 和复杂编排能力。
|
||||
|
||||
## 3. 总体架构
|
||||
## 3. 范围与阶段
|
||||
|
||||
### 3.1 架构分层
|
||||
### 3.1 MVP 范围
|
||||
|
||||
| 层级 | 主要能力 | 代表组件 |
|
||||
| ------------ | ---------------------------------------- | ------------------------------------------------------------------ |
|
||||
| 接入层 | 外部系统接入、协议解析、统一北向入口 | Kong Gateway、Apache Camel、SSIM 导入器 |
|
||||
| 业务层 | 航班管理、资源分配、里程碑管理、告警处理 | Flight Service、Resource Service、Milestone Service、Alert Service |
|
||||
| 事件与计算层 | 事件总线、流处理与预测、规则判定与编排 | Kafka、Flink、Drools、Temporal |
|
||||
| 数据层 | 事务存储、时序存储、缓存、检索 | PostgreSQL、TimescaleDB、Redis、OpenSearch |
|
||||
| 平台层 | 身份认证、部署运行、观测与服务治理 | Keycloak、Kubernetes、Prometheus/Grafana、Jaeger、Loki、Linkerd |
|
||||
首期上线只覆盖以下闭环:
|
||||
|
||||
### 3.2 核心模块职责
|
||||
- 航班计划导入与实时状态更新
|
||||
- 航班配对与过站上下文最小建模
|
||||
- 基础资源分配(Stand、Gate、Belt、Counter)
|
||||
- 关键里程碑跟踪与发布事实治理
|
||||
- 延误、资源冲突和数据质量告警
|
||||
- 对外查询接口与事件订阅
|
||||
- 审计、人工裁决、重放与复核闭环
|
||||
|
||||
- Flight Service:维护航班计划、动态状态和历史记录。
|
||||
- Resource Service:进行机位/登机口/行李转盘/值机柜台等资源分配与冲突检查,支持人工覆盖与审计。
|
||||
- Milestone Service:维护 A-CDM 关键里程碑时间点。
|
||||
- Alert Service:统一处理延误、冲突等运营告警。
|
||||
- ACISP 接口层:向航司、地服、AOC 提供查询与订阅能力。
|
||||
|
||||
### 3.3 核心实体标识约定(最小集)
|
||||
|
||||
- Flight:`carrier + flight_number + op_date + leg_no` 作为业务唯一标识。
|
||||
- Milestone:`flight_id + milestone_type + source + event_time` 作为幂等写入键。
|
||||
- ResourceAssignment:`resource_type + resource_id + time_window + flight_id` 作为分配唯一键。
|
||||
|
||||
### 3.4 权威边界(SSOT)与写入治理(MVP)
|
||||
|
||||
为实现“单一事实源(SSOT)”,AODB 必须对外明确两类信息:
|
||||
|
||||
1. **状态事实(Fact)**:AODB 对外提供的“当前状态”是唯一权威输出。
|
||||
2. **来源与裁决(Provenance)**:每个关键状态字段必须可追溯其来源、可信度与裁决过程。
|
||||
|
||||
#### 3.4.1 状态写入三元信息(最小要求)
|
||||
|
||||
所有关键状态写入(航班动态、里程碑、资源分配、告警)必须携带以下最小三元信息并持久化:
|
||||
|
||||
- `source`:来源系统/组织(如 ANSP/航司/地服/机场运行/人工裁决),并可扩展到具体系统标识。
|
||||
- `confidence`:可信度等级(建议:`confirmed`/`estimated`/`reported`/`suspect`),用于表示数据质量与可用性。
|
||||
- `decision`:裁决信息(可为空)。若发生冲突或人工覆盖,必须记录:裁决人/系统、裁决原因、裁决时间与裁决依据。
|
||||
|
||||
#### 3.4.2 权威边界与冲突裁决原则(MVP)
|
||||
|
||||
为避免“多系统同写同字段”导致不可控冲突,MVP 采用以下治理原则:
|
||||
|
||||
- **分层权威**:以“字段/里程碑”为粒度定义权威优先级(不同字段可不同)。例如:
|
||||
- **到离港实际时间类(如 ALDT)**:优先 ANSP/机场运行权威源,其次航司上报,最后为人工裁决。
|
||||
- **协同计划时间类(如 TOBT)**:优先航司/地服协同上报,其次机场运行,最后为人工裁决。
|
||||
- **资源分配类(机位/登机口/行李转盘/值机柜台)**:优先机场运行系统计算与人工调度,外部源仅作为建议输入。
|
||||
- **可信度优先**:在同等来源优先级下,`confidence` 更高者覆盖更低者。
|
||||
- **更正优先**:当上游明确发送“更正/撤销”语义(或带更高版本号/序列号)时,允许对既有事实进行修正,但必须保留历史与审计轨迹。
|
||||
- **不可判定进入旁路**:无法自动裁决的冲突必须进入“人工复核队列”,同时对外输出“冲突标记/数据质量标记”,避免静默覆盖。
|
||||
|
||||
#### 3.4.3 审计与可追溯要求(MVP)
|
||||
|
||||
- **审计覆盖范围**:
|
||||
- 航班关键状态字段的变更(计划/预计/实际时间、关键里程碑状态)
|
||||
- 资源分配变更(分配/释放/人工覆盖/回滚)
|
||||
- 告警生命周期变更(触发/确认/关闭/抑制)
|
||||
- **审计最小字段**:`who/what/when/why`(操作者或系统、变更字段、变更前后值、时间、原因/关联事件)。
|
||||
- **对外可见性**:对外查询接口必须能返回“当前值 + source/confidence + 最近一次裁决摘要”,以便订阅方正确解读数据质量。
|
||||
|
||||
### 3.5 核心实体与关系(ER 概念级,MVP)
|
||||
|
||||
本节定义 AODB 的最小“可落地”概念模型,用于约束后续数据字典与接口契约的一致性。
|
||||
|
||||
- Flight:航班在指定运行日(op_date)的运行对象,包含计划/预计/实际时间与当前态字段集合。
|
||||
- Milestone:A-CDM 里程碑事件记录(含来源、可信度、审计信息),与 Flight 关联。
|
||||
- Resource:资源主数据,MVP 覆盖:
|
||||
- Stand(机位)、Gate(登机口)、Belt(行李转盘)、Counter(值机柜台)
|
||||
- ResourceAssignment:资源占用/分配记录(含时间窗口、分配来源、是否人工覆盖),与 Flight 与 Resource 关联。
|
||||
- Alert:告警实体(延误/冲突/超阈值),含生命周期(触发、确认、关闭、抑制)与处置轨迹。
|
||||
- DataQualityFlag(可选但建议纳入 MVP):对“冲突/不可判定/低可信度”等数据质量问题的结构化标记,便于对外呈现与内部对账。
|
||||
|
||||
实体关系(概念级):
|
||||
|
||||
- 一个 Flight 对应多个 Milestone(1:N)。
|
||||
- 一个 Flight 在同一时间窗口内可占用多个资源(例如 Stand + Gate + Belt + Counter),每类资源对应多个 ResourceAssignment(1:N)。
|
||||
- 一个 Resource 在时间轴上对应多个 ResourceAssignment(1:N),但同一资源的占用窗口不得重叠(冲突即告警)。
|
||||
- Alert 可关联到 Flight,亦可关联到具体 Resource/ResourceAssignment(N:1)。
|
||||
|
||||
#### 3.5.1 主键与唯一性约束(高层口径)
|
||||
|
||||
- Flight:建议区分
|
||||
- `flight_key`(业务唯一键):`carrier + flight_number + op_date + leg_no`
|
||||
- `flight_id`(系统主键):内部生成的不可变 ID(推荐 UUID/雪花 ID)。
|
||||
- Resource:`resource_type + resource_code`(或 `resource_id`)唯一。
|
||||
- ResourceAssignment:同一 `resource_type + resource_id` 的 `time_window` 不允许重叠;若发生则必须产生冲突告警并进入人工/规则裁决。
|
||||
|
||||
### 3.6 Flight 状态模型(最小状态机,MVP)
|
||||
|
||||
为支撑“当前态查询”和“事件订阅”,AODB 对 Flight 的当前态至少需要统一以下字段口径:
|
||||
|
||||
- 时间类:计划(Scheduled)、预计(Estimated)、实际(Actual)三组时间;MVP 强制覆盖里程碑相关时间(如 EOBT/TOBT/TSAT/ALDT/EIBT)。
|
||||
- 资源类:当前生效的 Stand/Gate/Belt/Counter 分配(可为空),并能追溯来源与覆盖原因。
|
||||
- 质量类:是否存在冲突/待裁决标记(可由 DataQualityFlag/Alert 汇总而来)。
|
||||
|
||||
最小状态机(示意,非穷尽):
|
||||
|
||||
- Planned:已导入计划但无运行动态。
|
||||
- Active:已接收运行动态/里程碑并持续更新。
|
||||
- Completed:已到达关键收敛里程碑(例如到位/关舱等)并可进入归档策略。
|
||||
- Cancelled:取消/无效(保留审计与历史,避免硬删除)。
|
||||
|
||||
状态迁移原则:
|
||||
|
||||
- 状态迁移由“里程碑事实”驱动,不直接由单个外部系统声明。
|
||||
- 若存在冲突或裁决,状态不回滚到更早阶段,但可产生“更正事件/裁决事件”并更新当前态字段,同时保留历史。
|
||||
|
||||
### 3.7 历史、快照与可追溯(MVP)
|
||||
|
||||
为兼顾实时查询与审计追溯,MVP 推荐采用以下高层模式:
|
||||
|
||||
- CurrentState(可变):保存 Flight/Resource 的当前态,用于低延迟查询与看板展示。
|
||||
- EventLog(追加):保存标准化后的业务事件与关键变更(MilestoneUpserted、ResourceAssigned、AlertRaised 等),用于回放、对账与审计。
|
||||
|
||||
要求:
|
||||
|
||||
- CurrentState 的任何关键字段变更都必须能在 EventLog 中找到对应的原因事件(或裁决事件)。
|
||||
- 对外“历史回放”能力通过 EventLog/时间范围过滤实现;不要求首期提供全量任意时点快照,但必须支持“关键链路回放与审计抽样”。
|
||||
|
||||
### 3.8 计算、规则与工作流职责边界(Flink / Drools / Temporal,MVP)
|
||||
|
||||
为对齐“实时计算引擎为 MVP”以及可追溯与可审计要求,MVP 对计算/规则/编排做明确分工:
|
||||
|
||||
- Flink(流处理/实时计算):
|
||||
- 里程碑派生与聚合(例如从多源事件推导统一里程碑视图)。
|
||||
- 预测类计算的在线聚合与发布(EIBT/EXIT/EXOT 等的估计值生成/更新)。
|
||||
- 复杂事件检测(CEP):异常模式识别与实时指标聚合。
|
||||
- Drools(规则判定/可配置/可追溯):
|
||||
- 延误/冲突/阈值告警规则与资源分配约束校验规则。
|
||||
- 规则版本管理与灰度:规则变更必须可回放验证,避免误报/漏报。
|
||||
- 规则执行结果必须可追溯(输出触发条件、命中规则、输入快照摘要)。
|
||||
- Temporal(工作流编排/长事务/补偿):
|
||||
- DLQ/人工复核闭环:解析失败→任务分派→复核结果→重放/裁决事件输出。
|
||||
- 跨系统补偿流程:当外部源延迟/更正导致状态回补时,编排补偿与通知。
|
||||
- 关键处置流程:告警处置、资源冲突裁决的状态流转与审计留存。
|
||||
|
||||
验收口径(与 6.4 对齐):
|
||||
|
||||
- 对任一预测/告警/裁决结果,能够通过事件链路回放解释“数据从哪来、规则如何命中、流程如何流转”。
|
||||
|
||||
## 4. 关键数据流(初版)
|
||||
|
||||
### 4.1 航班计划导入流
|
||||
|
||||
1. 外部系统提交 SSIM/AIDX 数据。
|
||||
2. 接入层完成解析与标准化。
|
||||
3. Flight Service 写入 AODB 主库。
|
||||
4. 业务层发布航班状态事件给订阅方。
|
||||
|
||||
### 4.2 运行态更新流
|
||||
|
||||
1. 空管/航司发送运行动态(如 ALDT、TOBT)。
|
||||
2. Milestone Service 更新关键节点。
|
||||
3. Resource Service 根据最新状态重算资源占用。
|
||||
4. Alert Service 在冲突或延误时触发通知。
|
||||
|
||||
### 4.3 事件一致性与异常处理约束
|
||||
|
||||
#### 4.3.1 事件类型清单(MVP,建议最小集)
|
||||
|
||||
- FlightImported:航班计划已导入并标准化。
|
||||
- FlightUpdated:航班关键字段(计划/预计/实际/取消等)发生变更。
|
||||
- MilestoneUpserted:里程碑写入/更正(含来源、可信度与裁决)。
|
||||
- ResourceAssigned:资源已分配(Stand/Gate/Belt/Counter)。
|
||||
- ResourceUnassigned:资源已释放/撤销分配。
|
||||
- ResourceConflictDetected:资源占用冲突被检测到(需人工/规则裁决)。
|
||||
- AlertRaised:告警触发(延误/冲突/超阈值)。
|
||||
- AlertAcknowledged:告警已确认(进入处置中)。
|
||||
- AlertCleared:告警已关闭或解除。
|
||||
- DataQualityFlagged:产生数据质量标记(冲突、不可判定、低可信度等)。
|
||||
- ManualDecisionRecorded:人工裁决已记录(覆盖原因与证据)。
|
||||
|
||||
#### 4.3.2 事件最小字段(Envelope)
|
||||
|
||||
所有业务事件必须具备统一事件信封,确保可追溯、可回放、可演进:
|
||||
|
||||
- `event_id`:全局唯一 ID(用于去重与审计)。
|
||||
- `event_type`:事件类型(见 4.3.1)。
|
||||
- `schema_version`:事件 schema 版本(向后兼容为原则)。
|
||||
- `occurred_at`:业务发生时间(来自上游或由系统推断)。
|
||||
- `produced_at`:AODB 产生该事件的时间。
|
||||
- `source`:来源(与 3.4 一致)。
|
||||
- `idempotency_key`:幂等键(见 4.3.3)。
|
||||
- `correlation_id`:关联 ID(用于串联同一业务链路,如同一条 AFTN 报文/同一次导入批次)。
|
||||
- `flight_id`:关联航班(若适用)。
|
||||
- `payload`:事件负载(各事件类型自定义)。
|
||||
|
||||
#### 4.3.3 幂等与更正语义(MVP)
|
||||
|
||||
1. 所有写入事件必须携带 `idempotency_key`,重复事件不得产生重复副作用(至少做到 at-least-once 输入下的“结果幂等”)。
|
||||
2. 幂等键的生成原则:尽量使用上游“不可变消息标识/序列号”(如报文 ID、批次+行号),避免仅用 `event_time` 作为幂等锚点。
|
||||
3. 更正(Correction)必须显式:
|
||||
- 若上游具备更正/撤销语义,则映射为 `MilestoneUpserted`(含更正标记或更高序列),同时保留旧值审计。
|
||||
- 若上游无更正语义,则 AODB 只能通过“裁决事件(ManualDecisionRecorded)”修正当前态,并保留冲突与裁决轨迹。
|
||||
|
||||
#### 4.3.4 顺序保证边界与乱序处理(MVP)
|
||||
|
||||
1. 顺序保证以 `flight_id` 为最小粒度:同一 `flight_id` 的事件按分区键落到同一顺序通道(例如 Kafka 分区),确保消费端可按序处理。
|
||||
2. 同一 `flight_id` 内部的处理顺序以 `occurred_at` 优先,其次以 `source_sequence`(若上游提供)或 AODB 生成的 `ingest_sequence` 作为并列消歧。
|
||||
3. 过旧/乱序事件处理策略:
|
||||
- 允许在可配置“乱序窗口”内重排;超窗事件进入旁路审计并生成 DataQualityFlag。
|
||||
- 不允许静默覆盖已确认事实;需触发冲突标记或进入人工复核。
|
||||
|
||||
#### 4.3.5 写库与发事件一致性(Outbox/CDC,高层约束)
|
||||
|
||||
为避免“写库成功但没发事件/发了事件但没落库”的不可审计空洞,MVP 必须采用可验证的一致性策略之一:
|
||||
|
||||
- 主选:**Outbox Pattern + CDC**
|
||||
- 业务服务在同一数据库事务内:更新 CurrentState,并写入 Outbox 表。
|
||||
- CDC/发布器将 Outbox 可靠发布到 Kafka,并在成功后标记已发布。
|
||||
- 约束:
|
||||
- 事件发布必须可重试;失败不得丢失,且必须可回放。
|
||||
- 对外订阅以 Kafka 事件为事实流(或由 Kafka 驱动 Hasura 订阅层的投影),避免多路源头。
|
||||
|
||||
#### 4.3.6 解析失败、DLQ 与人工复核闭环(MVP)
|
||||
|
||||
1. 解析失败或校验失败消息进入 DLQ,并生成“人工复核任务”(可由工作流编排系统承接)。
|
||||
2. 人工复核结果必须形成结构化输出:要么生成可重放的标准化事件,要么生成裁决事件(ManualDecisionRecorded)。
|
||||
|
||||
#### 4.3.7 一致性口径(对齐需求)
|
||||
|
||||
- 关键实体(Flight 当前态、ResourceAssignment 生效集、Alert 生命周期)在同一服务内采用强一致事务写入。
|
||||
- 跨服务/跨投影(例如检索、订阅投影、指标聚合)采用最终一致,目标:**最终一致收敛 <= 30 秒**。
|
||||
- 验收方式:对账任务 + 抽检回放,必须能解释每一次不一致的根因(延迟、乱序、裁决、外部源缺陷等)。
|
||||
|
||||
#### 4.3.8 降级策略(MVP)
|
||||
|
||||
外部源异常抖动时启用降级策略:保留最近可信状态并标记数据可信度;对外订阅必须包含数据质量标记,避免下游误用。
|
||||
|
||||
### 4.4 资源分配规则(MVP)
|
||||
|
||||
MVP 资源管理覆盖:Stand(机位)、Gate(登机口)、Belt(行李转盘)、Counter(值机柜台)。资源分配的目标不是“全局最优”,而是保证冲突可检测、可裁决、可追溯,并能支撑秒级传播与对外可解释。
|
||||
|
||||
#### 4.4.1 时间窗口(time_window)口径
|
||||
|
||||
- **分配窗口组成**:`[start_time, end_time] + buffer_before + buffer_after`。
|
||||
- **锚点选择(MVP)**:
|
||||
- Stand:以 `ALDT/EIBT`(到达侧)与 `AOBT/ATOT`(离港侧)相关里程碑推导占用区间;若缺失则回退到 Estimated。
|
||||
- Gate:以旅客流程相关里程碑(如登机开始/结束、关舱/推出)推导;缺失时回退到 TOBT/TSAT 近似。
|
||||
- Belt:以 `AIBT/EIBT` 起算,结合航班机型/行李量经验参数给出默认占用时长(可配置)。
|
||||
- Counter:以航班计划起飞前固定窗口(如 T-3h 至 T-45min)为默认规则(可配置并可按航司差异化)。
|
||||
- **滑动更新**:当关键里程碑变更(延误、提前、取消、更正)时,ResourceAssignment 必须重算窗口并触发冲突检测。
|
||||
|
||||
#### 4.4.2 冲突定义与缓冲策略
|
||||
|
||||
- **冲突定义**:同一 `resource_type + resource_id` 的生效占用窗口发生重叠即为冲突。
|
||||
- **缓冲策略**:缓冲时间为规则参数(按资源类型/机场策略配置)。缓冲引入的冲突必须可解释(在告警中记录触发原因)。
|
||||
|
||||
#### 4.4.3 分配优先级与人工覆盖
|
||||
|
||||
MVP 采用“规则优先 + 人工可覆盖”的策略:
|
||||
|
||||
- 自动分配/调整由规则或简单启发式完成(不做全局优化),输出 ResourceAssigned/Unassigned 事件。
|
||||
- 人工覆盖(override)必须:
|
||||
- 记录 `decision`(原因/证据/操作者)并产生 ManualDecisionRecorded。
|
||||
- 可回滚(回滚同样写审计)。
|
||||
|
||||
#### 4.4.4 与航班变更联动(延误/取消/换机型)
|
||||
|
||||
- 延误:窗口整体右移或重新估算,先“保持原资源”并检测后续冲突;若冲突不可自动消解则触发 ResourceConflictDetected + AlertRaised。
|
||||
- 取消:释放资源并触发 ResourceUnassigned;若取消为更正则需保留历史并标记更正原因。
|
||||
- 换机型/机位限制变化:触发资源适配性校验,不满足则产生冲突并进入裁决流程。
|
||||
|
||||
#### 4.4.5 输出与审计(最小要求)
|
||||
|
||||
- 任何资源变更都必须能回答:谁分配的(规则/人工)、为什么分配、影响了哪些航班、是否引发冲突告警。
|
||||
|
||||
## 5. 首期上线范围(MVP)
|
||||
|
||||
首期建议只覆盖以下最小闭环:
|
||||
|
||||
- 航班计划导入与实时状态更新。
|
||||
- 基础资源分配(机位、登机口、行李转盘、值机柜台)。
|
||||
- 关键里程碑跟踪(EOBT/TOBT/TSAT/ALDT/EIBT)。
|
||||
- 延误与资源冲突告警。
|
||||
- 对外查询接口与订阅推送(REST + GraphQL Subscription)。
|
||||
### 3.2 非 MVP 范围
|
||||
|
||||
不纳入首期:
|
||||
|
||||
- 复杂优化排班(全局优化模型)。
|
||||
- 深度 AI 预测与自适应调度。
|
||||
- 多机场统一调度中心能力。
|
||||
- 复杂优化排班(全局优化模型)
|
||||
- 深度 AI 预测与自适应调度
|
||||
- Flink 驱动的复杂 CEP 和预测平台
|
||||
- Temporal 驱动的复杂长事务工作流平台
|
||||
- 多机场统一调度中心能力
|
||||
|
||||
### 5.1 上线门禁(Go/No-Go)
|
||||
### 3.3 分阶段演进
|
||||
|
||||
- 功能门禁:航班导入、里程碑更新、资源分配、冲突告警链路可端到端演示。
|
||||
- 性能门禁:在峰值吞吐与订阅并发条件下,端到端事件延迟达到最低可接受值(见 6.1/6.4/6.5 的压测口径)。
|
||||
- Phase 1:完成 MVP 闭环并上线单机场。
|
||||
- Phase 2:引入预测能力、复杂规则平台和补偿编排能力。
|
||||
- Phase 3:增强容量、容灾和多机场扩展。
|
||||
|
||||
## 4. 总体架构
|
||||
|
||||
### 4.1 架构分层
|
||||
|
||||
| 层级 | 主要能力 | MVP 主路径组件 | 后续增强组件 |
|
||||
| --- | --- | --- | --- |
|
||||
| 接入层 | 外部系统接入、协议解析、统一北向入口 | Kong Gateway、Apache Camel、SSIM 导入器 | 协议适配扩展插件 |
|
||||
| 业务层 | 航班当前态、观测治理、资源分配、告警处置、对外接口 | Flight Operation Service、Milestone Service、Resource Service、Alert Service、External API Service | 独立 Case / Workflow Service |
|
||||
| 事件层 | 事件骨干、重放、订阅分发 | Kafka、Outbox/CDC 发布器 | 订阅网关增强、Schema Registry |
|
||||
| 数据层 | 事务存储、时序存储、缓存 | PostgreSQL、TimescaleDB、Redis | OpenSearch、对象存储 |
|
||||
| 平台层 | 身份认证、部署、观测 | Keycloak、Kubernetes、Prometheus/Grafana/Loki | Linkerd、Jaeger |
|
||||
|
||||
### 4.2 领域划分与聚合边界
|
||||
|
||||
为避免多服务共同修改同一业务对象,MVP 采用以下聚合边界:
|
||||
|
||||
| 聚合 | 职责 | 主键 | 写主 | 发布事件 | 只读依赖 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| FlightOperation | 航班当前权威态、运行状态、发布事实 | `flight_id` | Flight Operation Service | `FlightUpdated`、`PublishedFactUpdated` | Turnaround、MilestoneObservation、ResourceAllocation |
|
||||
| MilestoneObservation | 里程碑原始观测、标准化观测、候选事实 | `observation_id` | Milestone Service | `MilestoneObserved`、`MilestoneNormalized` | FlightOperation |
|
||||
| Turnaround | 到达航班、离港航班、飞机周转上下文 | `turnaround_id` | Flight Operation Service | `TurnaroundLinked`、`TurnaroundCorrected` | FlightOperation |
|
||||
| ResourceAllocation | 资源占用、锁定、冲突、覆盖 | `allocation_id` | Resource Service | `ResourceAssigned`、`ResourceUnassigned`、`ResourceConflictDetected` | FlightOperation、Turnaround |
|
||||
| AlertCase | 告警和处置对象 | `alert_id` | Alert Service | `AlertRaised`、`AlertAcknowledged`、`AlertCleared` | FlightOperation、ResourceAllocation |
|
||||
|
||||
边界约束:
|
||||
|
||||
- Flight 当前权威态只能由 `Flight Operation Service` 写入。
|
||||
- Milestone Service 负责观测和候选事实,不直接改写 Flight 当前态。
|
||||
- Resource Service 只拥有资源占用与冲突事实,不直接修改 Flight 当前态中的非资源字段。
|
||||
- Alert Service 不产生业务事实,只管理处置状态和告警生命周期。
|
||||
|
||||
### 4.3 核心服务职责
|
||||
|
||||
- `Flight Operation Service`
|
||||
- 管理 FlightOperation 当前态。
|
||||
- 维护 Published Fact。
|
||||
- 负责 Turnaround 建模和关联修正。
|
||||
- `Milestone Service`
|
||||
- 接收外部运行动态。
|
||||
- 解析、标准化并形成 MilestoneObservation。
|
||||
- 依据字段权威矩阵给出候选事实。
|
||||
- `Resource Service`
|
||||
- 管理资源主数据和资源分配。
|
||||
- 进行适配校验、冲突检测、人工覆盖和回滚。
|
||||
- `Alert Service`
|
||||
- 管理告警、确认、关闭、抑制和处置轨迹。
|
||||
- `External API Service`
|
||||
- 提供查询接口。
|
||||
- 提供事件订阅接口或订阅分发适配层。
|
||||
- 不作为权威事实生成者。
|
||||
|
||||
## 5. 核心模型
|
||||
|
||||
### 5.1 核心标识约定
|
||||
|
||||
- Flight:
|
||||
- `flight_key`:`carrier + flight_number + op_date + leg_no`
|
||||
- `flight_id`:内部不可变主键
|
||||
- Turnaround:
|
||||
- `turnaround_id`
|
||||
- 可关联一个到达航班和一个离港航班
|
||||
- MilestoneObservation:
|
||||
- `observation_id`
|
||||
- 幂等键优先使用上游报文 ID、序列号或批次 + 行号
|
||||
- Resource:
|
||||
- `resource_id`
|
||||
- `resource_type + resource_code` 唯一
|
||||
- ResourceAllocation:
|
||||
- `allocation_id`
|
||||
- 幂等键由 `resource_id + validity_window + assignment_source + correlation_id` 组合约束
|
||||
|
||||
### 5.2 核心实体与关系
|
||||
|
||||
- FlightOperation:指定运行日上的航班运行对象,包含当前发布事实和状态摘要。
|
||||
- Turnaround:将到达航班、离港航班和飞机周转上下文关联起来,用于资源和时序联动。
|
||||
- MilestoneObservation:里程碑观测记录,保留原始来源、标准化结果和候选事实。
|
||||
- Resource:资源主数据,MVP 覆盖 Stand、Gate、Belt、Counter。
|
||||
- ResourceAllocation:资源分配记录,含有效窗口、锁定类型、来源和覆盖原因。
|
||||
- AlertCase:告警对象,关联 FlightOperation 或 ResourceAllocation。
|
||||
- DataQualityFlag:对冲突、低可信度、超窗乱序、待裁决等问题做结构化标记。
|
||||
|
||||
关系约束:
|
||||
|
||||
- 一个 FlightOperation 对应多个 MilestoneObservation。
|
||||
- 一个 Turnaround 可关联一个到达航班和一个离港航班,也允许只有单侧航班待补全。
|
||||
- 一个 Resource 在时间轴上可关联多个 ResourceAllocation,但硬冲突不允许同时生效。
|
||||
- AlertCase 可关联具体 FlightOperation、Turnaround 或 ResourceAllocation。
|
||||
|
||||
### 5.3 FlightOperation 最小字段组
|
||||
|
||||
- 主键:`flight_id`、`flight_key`
|
||||
- 属性:`carrier`、`flight_number`、`op_date`、`leg_no`、`direction`
|
||||
- 机体上下文:`aircraft_type`、`tail_number`(可空)
|
||||
- 状态:`flight_status`
|
||||
- 发布事实:计划 / 预计 / 实际时间类字段
|
||||
- 当前资源摘要:Stand / Gate / Belt / Counter
|
||||
- 质量摘要:冲突标记、待裁决标记、最近裁决摘要
|
||||
- 关联:`turnaround_id`(可空)
|
||||
|
||||
### 5.4 Turnaround 最小字段组
|
||||
|
||||
- `turnaround_id`
|
||||
- `arrival_flight_id`
|
||||
- `departure_flight_id`
|
||||
- `tail_number`
|
||||
- `aircraft_type`
|
||||
- `turnaround_status`
|
||||
- `link_source`
|
||||
- `link_confidence`
|
||||
|
||||
约束:
|
||||
|
||||
- 配对可以晚于航班导入发生。
|
||||
- 配对修正必须产生 `TurnaroundCorrected` 事件并保留审计。
|
||||
- 若未知配对,FlightOperation 仍可独立运行,但资源和里程碑解释能力下降。
|
||||
|
||||
## 6. 事实分层模型
|
||||
|
||||
### 6.1 三层模型
|
||||
|
||||
| 层 | 含义 | 是否可变 | 用途 |
|
||||
| --- | --- | --- | --- |
|
||||
| Observation | 上游原始或标准化观测 | 否 | 追溯、回放、取证 |
|
||||
| Decision | 规则或人工裁决结果 | 否 | 解释为什么当前事实成立 |
|
||||
| Published Fact | 当前对外权威事实 | 是 | 查询、订阅、共享 |
|
||||
|
||||
### 6.2 SSOT 定义
|
||||
|
||||
AODB 的 SSOT 不等于“数据库中的最后一次写入”,而是:
|
||||
|
||||
- 由 Observation 输入
|
||||
- 经字段级权威矩阵与裁决逻辑处理
|
||||
- 最终形成并发布的 Published Fact
|
||||
|
||||
### 6.3 状态写入三元信息
|
||||
|
||||
所有关键状态写入都必须附带:
|
||||
|
||||
- `source`
|
||||
- `confidence`
|
||||
- `decision`(可空)
|
||||
|
||||
其中:
|
||||
|
||||
- Observation 必须保存原始来源和原始时序。
|
||||
- Decision 必须保存裁决者、依据、原因和裁决时间。
|
||||
- Published Fact 必须能追溯到 Observation 和 Decision。
|
||||
|
||||
### 6.4 字段级权威矩阵(最小集)
|
||||
|
||||
| 字段 | 主来源 | 次来源 | 更正规则 | 人工覆盖 | 对外可见性 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| ALDT | ANSP / 机场运行 | 航司 | 明确更正或高版本号优先 | 允许 | 返回当前值 + 来源 |
|
||||
| AIBT | 地服 / 机场运行 | 航司 | 同上 | 允许 | 返回当前值 + 来源 |
|
||||
| EIBT | 系统计算 | 运行动态派生 | 新计算覆盖旧计算并留历史 | 允许 | 返回当前值 + 可信度 |
|
||||
| TOBT | 航司 / 地服 | 机场运行 | 最新有效更正优先 | 允许 | 返回当前值 + 裁决摘要 |
|
||||
| TSAT | AODB / P1 PDS | 机场运行 | 新计算版本优先 | 允许 | 返回当前值 + 算法版本 |
|
||||
| Stand Assignment | 机场运行系统 | 人工调度 | 人工覆盖优先并保留原因 | 必须审计 | 返回当前值 + 覆盖摘要 |
|
||||
| Gate Assignment | 机场运行系统 | 人工调度 | 同上 | 必须审计 | 返回当前值 + 覆盖摘要 |
|
||||
| Belt Assignment | 机场运行系统 | 人工调度 | 同上 | 必须审计 | 返回当前值 + 覆盖摘要 |
|
||||
| Counter Assignment | 机场运行系统 | 人工调度 | 同上 | 必须审计 | 返回当前值 + 覆盖摘要 |
|
||||
|
||||
## 7. Flight 状态模型
|
||||
|
||||
### 7.1 最小状态机
|
||||
|
||||
- Planned:已导入计划但尚无有效运行动态。
|
||||
- Active:已有运行动态、里程碑或资源变更。
|
||||
- Completed:已达到收敛里程碑并进入归档策略。
|
||||
- Cancelled:取消或无效,但保留完整历史。
|
||||
|
||||
### 7.2 状态迁移原则
|
||||
|
||||
- 状态迁移由 Published Fact 驱动,而不是由单个外部系统直接声明。
|
||||
- 若存在冲突或裁决,不回滚 Observation 历史,只更新 Published Fact 和当前状态摘要。
|
||||
- 状态修正必须能通过事件和审计链路回放。
|
||||
|
||||
## 8. 历史、审计与回放
|
||||
|
||||
### 8.1 数据存储视图
|
||||
|
||||
- `ObservationLog`
|
||||
- 保存原始或标准化观测
|
||||
- `DecisionLog`
|
||||
- 保存规则命中和人工裁决
|
||||
- `PublishedCurrentState`
|
||||
- 保存当前对外权威事实
|
||||
- `AuditTrail`
|
||||
- 保存 `who / what / when / why`
|
||||
|
||||
### 8.2 基本约束
|
||||
|
||||
- PublishedCurrentState 的任何关键字段变更都必须能在 ObservationLog 和 DecisionLog 中找到原因链路。
|
||||
- 人工覆盖不得改写原始 Observation,只能新增 Decision 并更新 Published Fact。
|
||||
- 历史回放以事件和日志为准,不以任意时点快照为首期前提。
|
||||
|
||||
## 9. 资源模型与冲突治理
|
||||
|
||||
### 9.1 Resource 模型
|
||||
|
||||
每个 Resource 至少具备:
|
||||
|
||||
- `resource_id`
|
||||
- `resource_type`
|
||||
- `resource_code`
|
||||
- `status`
|
||||
- `capability_profile`
|
||||
- `compatibility_constraints`
|
||||
- `parent_resource_id`(可空)
|
||||
- `operational_calendar`
|
||||
|
||||
### 9.2 ResourceAllocation 模型
|
||||
|
||||
每个 ResourceAllocation 至少具备:
|
||||
|
||||
- `allocation_id`
|
||||
- `resource_id`
|
||||
- `flight_id`
|
||||
- `turnaround_id`(可空)
|
||||
- `allocation_status`
|
||||
- `assignment_source`
|
||||
- `lock_type`(`soft` / `hard`)
|
||||
- `validity_window`
|
||||
- `override_reason`(可空)
|
||||
- `derived_from_event`
|
||||
- `conflict_flags`
|
||||
|
||||
### 9.3 冲突分类
|
||||
|
||||
| 冲突类型 | 说明 | 是否阻断 | 是否允许人工覆盖 |
|
||||
| --- | --- | --- | --- |
|
||||
| 时间冲突 | 占用时间窗重叠 | 是 | 是 |
|
||||
| 适配冲突 | 机型、能力或运行属性不匹配 | 是 | 受限 |
|
||||
| 状态冲突 | 资源停用、维护、冻结 | 是 | 否 |
|
||||
| 策略冲突 | 本地策略或运营规则违反 | 视规则 | 是 |
|
||||
|
||||
### 9.4 四类资源规则口径
|
||||
|
||||
- Stand
|
||||
- 关注机型适配、拖曳、到离港时间窗、过站联动。
|
||||
- Gate
|
||||
- 关注旅客流程时间窗、国际国内属性、步行距离和能力约束。
|
||||
- Belt
|
||||
- 关注到港时序、机型、行李量经验参数和恢复能力。
|
||||
- Counter
|
||||
- 关注值机开放窗口、航司差异化规则和共享柜台能力。
|
||||
|
||||
### 9.5 人工覆盖原则
|
||||
|
||||
- 自动分配只产生建议或默认分配。
|
||||
- 人工覆盖必须记录原因、证据、操作者和影响范围。
|
||||
- 回滚必须和覆盖一样事件化和审计化。
|
||||
|
||||
## 10. 事件模型与一致性
|
||||
|
||||
### 10.1 事件分类
|
||||
|
||||
| 事件类别 | 说明 | 示例 |
|
||||
| --- | --- | --- |
|
||||
| Domain Events | 聚合内部事实变化 | `FlightUpdated`、`ResourceAssigned` |
|
||||
| Integration Events | 对外共享的标准化事件 | `PublishedFactUpdated`、`AlertRaised` |
|
||||
| Audit Events | 审计和裁决事件 | `ManualDecisionRecorded` |
|
||||
| Case Events | 人工复核和告警处置状态变化 | `ReviewTaskOpened`、`AlertAcknowledged` |
|
||||
|
||||
### 10.2 MVP 事件清单
|
||||
|
||||
- `FlightImported`
|
||||
- `FlightUpdated`
|
||||
- `TurnaroundLinked`
|
||||
- `TurnaroundCorrected`
|
||||
- `MilestoneObserved`
|
||||
- `MilestoneNormalized`
|
||||
- `PublishedFactUpdated`
|
||||
- `ResourceAssigned`
|
||||
- `ResourceUnassigned`
|
||||
- `ResourceConflictDetected`
|
||||
- `AlertRaised`
|
||||
- `AlertAcknowledged`
|
||||
- `AlertCleared`
|
||||
- `DataQualityFlagged`
|
||||
- `ManualDecisionRecorded`
|
||||
- `ReviewTaskOpened`
|
||||
- `ReviewTaskClosed`
|
||||
|
||||
### 10.3 事件归属表
|
||||
|
||||
| 事件 | 归属聚合 | 触发条件 | 是否对外发布 | 是否可回放 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `MilestoneObserved` | MilestoneObservation | 收到有效运行动态 | 否 | 是 |
|
||||
| `PublishedFactUpdated` | FlightOperation | 当前权威事实发生变化 | 是 | 是 |
|
||||
| `ResourceAssigned` | ResourceAllocation | 资源分配生效 | 是 | 是 |
|
||||
| `ResourceConflictDetected` | ResourceAllocation | 检测到冲突 | 是 | 是 |
|
||||
| `ManualDecisionRecorded` | Decision / Audit | 人工裁决完成 | 是 | 是 |
|
||||
| `AlertRaised` | AlertCase | 达到告警条件 | 是 | 是 |
|
||||
|
||||
### 10.4 统一事件信封
|
||||
|
||||
所有业务事件必须具备:
|
||||
|
||||
- `event_id`
|
||||
- `event_type`
|
||||
- `schema_version`
|
||||
- `occurred_at`
|
||||
- `produced_at`
|
||||
- `source`
|
||||
- `idempotency_key`
|
||||
- `correlation_id`
|
||||
- `aggregate_id`
|
||||
- `payload`
|
||||
|
||||
### 10.5 幂等、顺序和更正语义
|
||||
|
||||
- 所有写入事件必须携带 `idempotency_key`。
|
||||
- 顺序保证以 `flight_id` 为最小粒度。
|
||||
- 更正必须显式表达,不允许静默覆盖已发布事实。
|
||||
- 乱序允许在可配置窗口内重排,超窗进入审计旁路并打数据质量标记。
|
||||
|
||||
### 10.6 写库与发事件一致性
|
||||
|
||||
MVP 采用 `Outbox Pattern + CDC`:
|
||||
|
||||
- 业务服务在同一事务内更新 PublishedCurrentState 并写入 Outbox。
|
||||
- CDC / 发布器将 Outbox 可靠发布到 Kafka。
|
||||
- 发布失败必须可重试、可恢复、可审计。
|
||||
|
||||
## 11. 查询接口与事件订阅
|
||||
|
||||
### 11.1 接口分离原则
|
||||
|
||||
- 查询接口负责读取 Published Fact、历史明细和告警状态。
|
||||
- 事件订阅负责分发标准化事件流。
|
||||
- 查询接口不是事实流;订阅接口不承担读模型查询职责。
|
||||
|
||||
### 11.2 查询接口
|
||||
|
||||
最小查询对象:
|
||||
|
||||
- FlightOperation 当前态
|
||||
- MilestoneObservation 明细
|
||||
- ResourceAllocation 生效集
|
||||
- AlertCase 生命周期
|
||||
|
||||
最小要求:
|
||||
|
||||
- 支持按 `op_date`、`flight_id / flight_key`、资源类型、状态过滤
|
||||
- 返回更新时间和数据版本
|
||||
- 关键字段返回 `source / confidence / decision summary`
|
||||
|
||||
### 11.3 事件订阅接口
|
||||
|
||||
最小要求:
|
||||
|
||||
- 按 `event_type`、`flight_id`、`op_date` 过滤
|
||||
- 至少一次投递
|
||||
- 支持断线重连和补偿
|
||||
- 基于 `event_id` 或游标回放
|
||||
- 支持租户隔离、连接数和推送速率限流
|
||||
|
||||
### 11.4 消费者契约
|
||||
|
||||
- 顺序仅保证到 `flight_id`
|
||||
- 消费者必须按 `event_id` 去重
|
||||
- 消费者必须处理数据质量标记和裁决摘要
|
||||
- 回放窗口和游标语义必须文档化并纳入验收
|
||||
|
||||
## 12. 规则体系与人工复核
|
||||
|
||||
### 12.1 规则分类
|
||||
|
||||
- `authority rules`
|
||||
- `validation rules`
|
||||
- `conflict rules`
|
||||
- `alert rules`
|
||||
- `allocation heuristics`
|
||||
|
||||
### 12.2 规则最小模板
|
||||
|
||||
每条规则都必须定义:
|
||||
|
||||
- 输入
|
||||
- 输出
|
||||
- 优先级
|
||||
- 命中条件
|
||||
- 可解释字段
|
||||
- 回放测试方式
|
||||
|
||||
### 12.3 人工复核对象
|
||||
|
||||
- 解析失败复核
|
||||
- 里程碑冲突复核
|
||||
- 资源冲突裁决
|
||||
- 人工覆盖审批
|
||||
|
||||
### 12.4 Case 状态机
|
||||
|
||||
- `open`
|
||||
- `assigned`
|
||||
- `reviewing`
|
||||
- `decided`
|
||||
- `replayed`
|
||||
- `closed`
|
||||
|
||||
原则:
|
||||
|
||||
- 所有人工动作都必须事件化。
|
||||
- 所有人工动作都必须形成审计记录。
|
||||
|
||||
## 13. 非功能与部署
|
||||
|
||||
### 13.1 最小 SLO
|
||||
|
||||
| 指标 | 目标值 | 最低可接受值 |
|
||||
| --- | --- | --- |
|
||||
| 可用性 | 月度 99.95% | 月度 99.9% |
|
||||
| 事件处理延迟 | P95 <= 2 秒 | P95 <= 5 秒 |
|
||||
| 容灾恢复 | RTO <= 30 分钟,RPO <= 5 分钟 | RTO <= 2 小时,RPO <= 15 分钟 |
|
||||
| 审计覆盖率 | 100% 关键变更可追溯 | 99.9% 可追溯 |
|
||||
|
||||
### 13.2 最小部署拓扑
|
||||
|
||||
| 组件 | 部署方式 | 高可用方式 | 失败影响 | 恢复方式 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| PostgreSQL / TimescaleDB | Stateful 部署 | 主备切换 + 定时备份 | 当前态和审计写入受影响 | 备份恢复 + 故障切换 |
|
||||
| Kafka | 多副本集群 | 副本和 ISR 保障 | 事件流中断或降级 | Broker 恢复 + 消费追赶 |
|
||||
| CDC / 发布器 | 无状态服务 | 多副本 + 幂等发布 | Outbox 堆积 | 断点续传 + 重试 |
|
||||
| API / 业务服务 | 无状态部署 | 多副本 | 查询或写入能力降级 | 滚动恢复 |
|
||||
| Redis | 主从或哨兵 | 缓存级高可用 | 热点查询性能下降 | 重建缓存 |
|
||||
|
||||
### 13.3 关键容灾约束
|
||||
|
||||
- PostgreSQL 必须具备 PITR 或等价恢复能力。
|
||||
- Kafka 必须明确 `replication factor`、`min ISR`、保留窗口和重放策略。
|
||||
- Outbox / CDC 必须具备断点恢复和重复投递幂等能力。
|
||||
- 容灾演练必须覆盖数据库切换、事件堆积、订阅重连和回放。
|
||||
|
||||
### 13.4 SLO 映射表
|
||||
|
||||
| SLO | 设计支撑 | 验收方式 |
|
||||
| --- | --- | --- |
|
||||
| 可用性 | 多副本 API、DB HA、Kafka 副本 | 演练和月度故障统计 |
|
||||
| 延迟 | 单聚合写主、Kafka 事件骨干、缓存热点读 | 压测和生产观测 |
|
||||
| RTO / RPO | DB 备份恢复、Kafka 重放、CDC 恢复 | 容灾演练 |
|
||||
| 审计覆盖 | Observation / Decision / AuditTrail | 抽样链路回放 |
|
||||
|
||||
## 14. 上线门禁(Go / No-Go)
|
||||
|
||||
- 功能门禁:计划导入、动态接入、里程碑发布事实、资源分配、冲突告警、人工裁决链路可端到端演示。
|
||||
- 数据门禁:核心实体对账通过率 >= 99.9%,无高危不一致项。
|
||||
- 一致性门禁:Outbox / CDC、重放、幂等和断线补偿完成验证。
|
||||
- 安全门禁:统一认证鉴权生效,关键接口通过授权与审计检查。
|
||||
- 演练门禁:完成容灾恢复与回滚演练,RTO/RPO 达到最低可接受值并留存记录。
|
||||
- 演练门禁:完成数据库恢复、事件重放和订阅补偿演练。
|
||||
|
||||
### 5.2 关键场景走读(MVP)
|
||||
## 15. 文档边界与引用
|
||||
|
||||
本节用于评审阶段快速验证“闭环是否成立、可追溯是否可用、异常是否可处置”。
|
||||
|
||||
#### 场景 1:SSIM 导入 → 标准化 → 发布 → 订阅
|
||||
|
||||
1. SSIM 导入进入接入层(解析/校验/标准化)。
|
||||
2. Flight Service 在事务内写 CurrentState + Outbox。
|
||||
3. CDC/发布器将 Outbox 事件发布到 Kafka(FlightImported/FlightUpdated)。
|
||||
4. Hasura/订阅层向终端/外部系统推送订阅事件或提供查询读。
|
||||
|
||||
验收点:重复导入不产生重复副作用;订阅可重连补偿;可追溯到导入批次与来源。
|
||||
|
||||
#### 场景 2:多源里程碑冲突(以 ALDT 为例)→ 裁决 → 审计 → 对外呈现
|
||||
|
||||
1. 两个来源上报同一航班 ALDT,发生冲突(source/confidence/序列不一致)。
|
||||
2. 系统按 3.4 裁决原则尝试自动裁决;不可判定则产生 DataQualityFlagged + 进入人工复核。
|
||||
3. 人工复核通过工作流记录 ManualDecisionRecorded,更新当前态并保留历史。
|
||||
4. 对外查询返回“当前值 + source/confidence + 裁决摘要”;订阅推送裁决事件。
|
||||
|
||||
验收点:冲突不静默覆盖;审计可还原变更前后与原因;最终一致收敛 <= 30 秒。
|
||||
|
||||
#### 场景 3:延误导致资源冲突(以 Stand 为例)→ 告警 → 覆盖/回滚
|
||||
|
||||
1. 延误触发 ResourceAssignment 窗口右移,检测到同机位窗口重叠。
|
||||
2. 产生 ResourceConflictDetected + AlertRaised;规则可给出建议(可选)。
|
||||
3. 调度人工覆盖资源分配(记录 decision),触发 ResourceAssigned + ManualDecisionRecorded。
|
||||
4. 如需回滚,回滚同样形成事件与审计。
|
||||
|
||||
验收点:冲突检测可解释;覆盖/回滚全链路可追溯;订阅方能收到变更并理解可信度。
|
||||
|
||||
## 6. 非功能目标(初步)
|
||||
|
||||
- 可用性:支持 7x24 运行。
|
||||
- 实时性:核心状态更新达到秒级可见。
|
||||
- 可追溯:关键状态变化具备审计记录。
|
||||
- 安全性:统一认证鉴权与最小权限控制。
|
||||
|
||||
### 6.2 对外接口(MVP 合同口径)
|
||||
|
||||
MVP 对外提供“查询 + 订阅”两类能力,并明确北向治理边界:
|
||||
|
||||
- **北向入口**:统一经 API Gateway(Kong)进入,执行认证鉴权、限流、审计与路由治理。
|
||||
- **接口形态**:
|
||||
- REST:面向外部系统的标准查询与批量拉取。
|
||||
- GraphQL(Hasura):面向运营终端与需要实时订阅的消费者,提供订阅与细粒度字段选择。
|
||||
|
||||
#### 6.2.1 查询(Query)最小约束
|
||||
|
||||
- 核心查询对象:Flight(当前态)、Milestone(明细/时间序列)、ResourceAssignment(生效集)、Alert(生命周期)。
|
||||
- 过滤维度:`op_date`、`flight_key/flight_id`、状态(Planned/Active/Completed/Cancelled)、资源类型与资源编号。
|
||||
- 分页与一致性:必须支持稳定分页(cursor/offset 任选其一作为主选并写清),并能返回“数据版本/更新时间”以支持下游对账。
|
||||
- 数据质量:关键字段必须返回 `source/confidence`,存在冲突时必须返回“冲突标记/待裁决标记”。
|
||||
|
||||
#### 6.2.2 订阅(Subscription)最小约束
|
||||
|
||||
- 订阅源:以 AODB 标准化业务事件为事实流(见 4.3 事件契约)。
|
||||
- 订阅粒度:按 `event_type` 与 `flight_id/op_date` 过滤;支持“关键事件流”订阅(只推 Flight/Milestone/Resource/Alert 的变更摘要)。
|
||||
- 可靠性:至少提供 at-least-once 投递语义;订阅必须支持断线重连与补偿(基于 `event_id` 或可回放游标)。
|
||||
- 限流与隔离:对外订阅连接数、推送速率、单租户资源上限必须可配置并可观测。
|
||||
|
||||
#### 6.2.3 鉴权、限流与审计(Kong 治理边界)
|
||||
|
||||
- 鉴权:OIDC/OAuth2(Keycloak)为统一入口;按角色/Scope 控制 Flight/Resource/Alert 的读写与订阅权限。
|
||||
- 限流:对“查询 QPS、订阅连接数、推送速率”分别限流,且需要能按租户/客户端维度配置。
|
||||
- 审计:所有“写入类操作”(包含人工裁决、资源覆盖、告警处置)必须审计;对外查询/订阅的访问也需记录最小审计日志(用于追溯与合规)。
|
||||
|
||||
### 6.3 安全与合规(MVP)
|
||||
|
||||
- 认证授权:OIDC/OAuth2 + RBAC(Keycloak),最小权限原则。
|
||||
- 传输安全:北向 TLS;服务间建议启用 mTLS(与服务网格能力对齐)。
|
||||
- 数据分级:至少区分“运营敏感字段”和“可共享字段”,并在接口层实现字段级权限控制(GraphQL 尤其需要明确)。
|
||||
|
||||
### 6.1 最小 SLO(评审口径)
|
||||
|
||||
| 指标 | 目标值 | 最低可接受值 |
|
||||
| ------------ | ----------------------------- | ----------------------------- |
|
||||
| 可用性 | 月度 99.95% | 月度 99.9% |
|
||||
| 事件处理延迟 | P95 <= 2 秒 | P95 <= 5 秒 |
|
||||
| 容灾恢复 | RTO <= 30 分钟,RPO <= 5 分钟 | RTO <= 2 小时,RPO <= 15 分钟 |
|
||||
| 审计覆盖率 | 100% 关键变更可追溯 | 99.9% 可追溯 |
|
||||
|
||||
### 6.4 验收与可观测口径(MVP)
|
||||
|
||||
为确保 SLO 可被验证,MVP 至少需要定义并采集以下运行指标:
|
||||
|
||||
- 事件端到端延迟:ingest → commit(CurrentState/Outbox) → publish(Kafka) → deliver(订阅端)(按 P95/P99 统计)。
|
||||
- DLQ 率:解析失败/校验失败/旁路审计占比与趋势。
|
||||
- 幂等命中率:重复事件去重命中比例(用于评估上游质量与系统健壮性)。
|
||||
- 冲突率与 MTTR:资源冲突/里程碑冲突发生频率与平均处置时间。
|
||||
- 订阅健康:订阅连接数、推送速率、订阅落后量(按租户/客户端)。
|
||||
|
||||
验收方式(与需求对齐):
|
||||
|
||||
- 压测:在峰值吞吐假设下验证 P95 延迟达标。
|
||||
- 对账与抽检:验证强一致实体与最终一致收敛(<= 30 秒)的抽样结果可解释。
|
||||
- 容灾演练:验证 RTO/RPO 达到最低可接受值并留存演练记录。
|
||||
|
||||
### 6.5 容量基线与伸缩策略(MVP 口径)
|
||||
|
||||
本节用于把“500 万至 3000 万吞吐机场”的范围,映射为可评审、可压测的容量假设(范围值即可,后续以压测修正)。
|
||||
|
||||
#### 6.5.1 容量假设(建议范围)
|
||||
|
||||
- 航班量:约 150–900 架次/日(按机场规模与航班结构波动)。
|
||||
- 事件密度:每航班 20–80 条关键事件(计划导入、动态更新、里程碑、资源变更、告警与裁决)。
|
||||
- 峰值事件速率:10–200 events/s(含短时抖动与重放)。
|
||||
- 订阅规模:10–500 并发订阅连接(运营终端、航司、地服、AOC 等),推送速率按租户限额。
|
||||
|
||||
#### 6.5.2 伸缩策略(高层约束)
|
||||
|
||||
- 事件骨干(Kafka):按 `flight_id` 分区保证同航班顺序;通过增加分区与消费组并行度扩展吞吐。
|
||||
- 流处理(Flink):关键作业(预测/CEP/聚合)支持水平扩展;必须具备状态一致性与可恢复能力(与 RTO/RPO 对齐)。
|
||||
- 事务库(PostgreSQL/TimescaleDB):写路径优先保证强一致与审计;读路径通过缓存与只读副本(可选)缓解压力。
|
||||
- 检索(OpenSearch):仅承载检索/分析投影,不作为强一致事实源;索引延迟纳入最终一致指标。
|
||||
|
||||
#### 6.5.3 压测口径(最小)
|
||||
|
||||
- 压测必须覆盖:
|
||||
- 峰值事件速率 + 乱序/重复输入(验证幂等与乱序策略)。
|
||||
- 订阅并发 + 推送速率上限(验证网关限流与订阅补偿)。
|
||||
- DLQ 率提升场景(验证人工复核闭环与系统降级)。
|
||||
|
||||
## 7. 迭代方向
|
||||
|
||||
Phase 1:完成 MVP 闭环并上线单机场。
|
||||
|
||||
Phase 2:补充预测能力和规则优化,提高运行效率。
|
||||
|
||||
Phase 3:增强容量与容灾,支持多机场扩展。
|
||||
|
||||
## 8. 文档边界与引用
|
||||
|
||||
- 本文档仅定义初步高层设计,不展开详细数据字典、接口字段级协议和部署参数。
|
||||
- 技术栈主选、备选触发条件以 `airport-wiki/concepts/aodb/开源技术栈选型决策.md` 为准。
|
||||
- 本文档定义首期可开工的高层设计,不展开字段级数据字典和实现细节。
|
||||
- 技术栈主选、后续启用条件以 `airport-wiki/concepts/aodb/开源技术栈选型决策.md` 为准。
|
||||
- 需求边界、验收基线以 `airport-wiki/concepts/aodb/AODB 核心需求提炼.md` 为准。
|
||||
- 字段级权威矩阵以 `airport-wiki/concepts/aodb/AODB 字段级权威矩阵.md` 为准。
|
||||
- 事件 envelope 和 payload 草案以 `airport-wiki/concepts/aodb/AODB 事件 Schema 草案.md` 为准。
|
||||
- 最小部署拓扑和恢复策略草案以 `airport-wiki/concepts/aodb/AODB 最小部署拓扑草案.md` 为准。
|
||||
- 实施拆解以 `airport-wiki/concepts/aodb/AODB 实施 Backlog.md` 为准。
|
||||
- 关键设计取舍以 `airport-wiki/concepts/aodb/adr/` 下 ADR 为准。
|
||||
|
||||
Reference in New Issue
Block a user