19 KiB
19 KiB
开源机场运营数据库(AODB)高层设计文档
1. 文档目标
本文档定义 AODB MVP 的技术方案基线,重点回答以下问题:
- AODB 在 MVP 内承载哪些业务闭环,以及哪些能力明确不做。
- 系统如何划分聚合、服务、数据流和事件边界。
- 航班、里程碑、资源、告警等核心对象如何建模。
- 发布事实如何在观测、裁决、审计和订阅之间保持一致。
- 查询、订阅、部署、容灾和可观测性如何落到可实现架构。
适用范围:年旅客吞吐量 500 万至 3000 万机场,优先支持单机场部署。
2. 设计原则
- 单一事实源:AODB 对外发布单一当前权威事实,不暴露“谁最后写入”式伪一致。
- 事实分层:原始观测、裁决记录、发布事实必须分层建模。
- 写主清晰:每个核心聚合只允许一个服务写入,避免跨服务共享可变状态。
- 事件驱动:状态变化通过事件传播,系统通过契约解耦。
- 规则可解释:字段权威、冲突裁决、人工覆盖必须可追溯、可回放、可解释。
- 渐进复杂度:MVP 先建立稳定闭环,不引入复杂优化平台和长事务编排平台。
3. 范围定义
3.1 MVP 范围
首期只覆盖以下闭环:
- 航班计划导入与实时状态更新
- 航班配对与过站上下文最小建模
- 基础资源分配:Stand、Gate、Belt、Counter
- 关键里程碑跟踪与发布事实治理
- 延误、资源冲突和数据质量告警
- 对外查询接口与事件订阅
- 审计、人工裁决、重放与复核闭环
3.2 非 MVP 范围
首期不纳入以下能力:
- 全局优化排班和复杂资源优化求解
- 深度 AI 预测和自适应调度
- Flink 驱动的复杂 CEP 平台
- Temporal 驱动的复杂长事务工作流平台
- 多机场统一调度中心能力
4. 总体架构
4.1 架构分层
| 层级 | 主要能力 | MVP 主路径组件 | 说明 |
|---|---|---|---|
| 接入层 | 外部系统接入、协议解析、统一北向入口 | Kong Gateway、Apache Camel、SSIM 导入器 | 接收计划、动态、资源和人工操作输入 |
| 业务层 | 航班当前态、观测治理、资源分配、告警处置、外部接口 | Flight Operation Service、Milestone Service、Resource Service、Alert Service、External API Service | 承担领域逻辑和对外契约 |
| 事件层 | 事件骨干、重放、订阅分发 | Kafka、Outbox/CDC 发布器 | 负责异步传播和回放 |
| 数据层 | 事务存储、时序存储、缓存 | PostgreSQL、TimescaleDB、Redis | 保存当前态、审计链路和热点读模型 |
| 平台层 | 认证鉴权、部署、观测 | Keycloak、Kubernetes、Prometheus/Grafana/Loki | 提供运行时底座 |
4.2 核心技术链路
MVP 主链路采用“接入标准化 -> 观测入库 -> 裁决生成 -> 发布事实更新 -> 事件发布 -> 查询/订阅消费”的结构:
- 外部计划或运行动态通过接入层进入系统。
- Milestone Service 将输入标准化为 Observation,并按幂等键写入。
- 规则引擎根据字段权威矩阵和当前上下文生成 Decision。
- Flight Operation Service 更新 Published Fact 和当前状态摘要。
- 同一事务内写入 Outbox,由 CDC 发布到 Kafka。
- External API Service 对外提供查询接口和事件订阅接口。
- 告警、人工裁决和重放都沿同一事实链路工作,不直接绕过 Published Fact。
4.3 领域划分与聚合边界
为避免多服务共同修改同一业务对象,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.4 核心服务职责
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_noflight_id:内部不可变主键
- Turnaround
turnaround_id- 可关联一个到达航班和一个离港航班
- MilestoneObservation
observation_id- 幂等键优先使用上游报文 ID、序列号或批次 + 行号
- Resource
resource_idresource_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_idarrival_flight_iddeparture_flight_idtail_numberaircraft_typeturnaround_statuslink_sourcelink_confidence
约束:
- 配对可以晚于航班导入发生。
- 配对修正必须产生
TurnaroundCorrected事件并保留审计。 - 若未知配对,FlightOperation 仍可独立运行,但资源和里程碑解释能力下降。
6. 事实分层模型
6.1 三层模型
| 层 | 含义 | 是否可变 | 用途 |
|---|---|---|---|
| Observation | 上游原始或标准化观测 | 否 | 追溯、回放、取证 |
| Decision | 规则或人工裁决结果 | 否 | 解释为什么当前事实成立 |
| Published Fact | 当前对外权威事实 | 是 | 查询、订阅、共享 |
6.2 SSOT 定义
AODB 的 SSOT 不等于“数据库中的最后一次写入”,而是:
- 由 Observation 输入
- 经字段级权威矩阵与裁决逻辑处理
- 最终形成并发布的 Published Fact
6.3 状态写入三元信息
所有关键状态写入都必须附带:
sourceconfidencedecision(可空)
其中:
- 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_idresource_typeresource_codestatuscapability_profilecompatibility_constraintsparent_resource_id(可空)operational_calendar
9.2 ResourceAllocation 模型
每个 ResourceAllocation 至少具备:
allocation_idresource_idflight_idturnaround_id(可空)allocation_statusassignment_sourcelock_type(soft/hard)validity_windowoverride_reason(可空)derived_from_eventconflict_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 事件清单
FlightImportedFlightUpdatedTurnaroundLinkedTurnaroundCorrectedMilestoneObservedMilestoneNormalizedPublishedFactUpdatedResourceAssignedResourceUnassignedResourceConflictDetectedAlertRaisedAlertAcknowledgedAlertClearedDataQualityFlaggedManualDecisionRecordedReviewTaskOpenedReviewTaskClosed
10.3 事件归属表
| 事件 | 归属聚合 | 触发条件 | 是否对外发布 | 是否可回放 |
|---|---|---|---|---|
MilestoneObserved |
MilestoneObservation | 收到有效运行动态 | 否 | 是 |
PublishedFactUpdated |
FlightOperation | 当前权威事实发生变化 | 是 | 是 |
ResourceAssigned |
ResourceAllocation | 资源分配生效 | 是 | 是 |
ResourceConflictDetected |
ResourceAllocation | 检测到冲突 | 是 | 是 |
ManualDecisionRecorded |
Decision / Audit | 人工裁决完成 | 是 | 是 |
AlertRaised |
AlertCase | 达到告警条件 | 是 | 是 |
10.4 统一事件信封
所有业务事件必须具备:
event_idevent_typeschema_versionoccurred_atproduced_atsourceidempotency_keycorrelation_idaggregate_idpayload
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 rulesvalidation rulesconflict rulesalert rulesallocation heuristics
12.2 规则最小模板
每条规则都必须定义:
- 输入
- 输出
- 优先级
- 命中条件
- 可解释字段
- 回放测试方式
12.3 人工复核对象
- 解析失败复核
- 里程碑冲突复核
- 资源冲突裁决
- 人工覆盖审批
12.4 Case 状态机
openassignedreviewingdecidedreplayedclosed
原则:
- 所有人工动作都必须事件化。
- 所有人工动作都必须形成审计记录。
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 可观测性要求
- 所有写路径必须具备请求追踪、事件追踪和审计追踪三类关联 ID。
- 关键链路必须暴露延迟、失败率、积压量和重试次数指标。
- 人工裁决、资源覆盖和更正事件必须进入统一审计检索视图。
- 订阅接口必须暴露连接数、滞后量、推送速率和补偿次数指标。
14. 文档边界与引用
- 本文档定义首期可开工的技术方案,不展开字段级数据字典和实现细节。
- 技术栈主选和启用条件以
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/adr/下 ADR 为准。