# 架构分层设计:四层模型 本架构旨在将同步系统的**数据容器**、**同步逻辑**、**执行层**与**编排流程**完全解耦,提供极简且类型安全的开发体验。 --- ## 1. 架构概览 系统分为四层,依赖关系严格从上到下: 1. **通用层 (Common)**: 定义纯数据结构(Data Container)和基础工具。 2. **同步系统层 (Sync System)**: 定义同步行为接口(SyncStrategy)与业务规则。 3. **数据源层 (DataSource)**: 实现数据的加载与持久化,属于盲目执行层。 4. **编排层 (Pipeline)**: 应用层逻辑,硬编码同步顺序,协调 ID 映射与错误传播。 --- ## 2. 通用层 (Layer 0: Common) 本层不包含业务逻辑,仅定义数据契约。 - **SyncNode[T]**: 核心状态机容器。 - `origin_data`: 原始数据(对应 `data_id`)。 - `data`: 计算后的最新目标数据。 - `data_id`: 业务主键ID。加载时必定有值,CREATE 节点初始为空字符串 `""`(布尔值为 False,可通过校验)。 - `action`: 同步意图 (NONE, CREATE, UPDATE, DELETE)。 - `status`: 执行状态 (PENDING, IN_PROGRESS, SUCCESS, FAILED, SKIPPED, PRECONDITION_FAILED)。 - 详见 [状态定义规范 § 5.A](./状态定义规范.md#5-执行同步状态转换-physical-sync-state-transitions) - `binding_status`: 绑定状态 (UNCHECKED, NORMAL, MISSING, DEPENDENCY_ERROR, ABNORMAL, WARNING)。 - 详见 [状态定义规范 § 1](./状态定义规范.md#1-核心状态判定表-core-binding-matrix) - `error`: 异常详情。 - **DataCollection**: 节点的集合,提供类型安全的查询和过滤方法。 - **BindingManager**: - **ID 映射**: 维护 `local_node_id` <-> `remote_node_id` 的双向映射。 - **绑定键**: 使用 `node_id` 作为绑定记录的键,**一致不变**。CREATE 成功后只更新节点的 `data_id`,绑定记录不变。 - **持久化**: 将映射关系持久化到存储(如 JSON/数据库)。 - **Enums**: `SyncAction`, `SyncStatus`, `BindingStatus` 等。 --- ## 3. 同步系统层 (Layer 1: Sync System) 核心业务逻辑层。通过实现 `SyncStrategy` 接口来定义特定实体的同步逻辑。 - **SyncStrategy[T] 接口**: - `bind()`: - 职责:判定 `binding_status` (NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR) - 详见 [状态定义规范 § 1-3](./状态定义规范.md) - `create()`: - 职责:处理孤儿节点(MISSING),在对方侧创建新节点并设置 `action=CREATE` - **ID 替换**: 创建新节点时,复制数据并将依赖字段的本地 ID 替换为远程 ID - **内联检查**: 通过 `IDResolver.resolve_and_validate()` 验证依赖 ID 解析 - 详见 [状态定义规范 § 4.C](./状态定义规范.md) - `update()`: - 职责:处理差异节点(NORMAL 且有 diff),设置 `action=UPDATE` - **ID 替换**: 准备更新数据时,替换数据中的依赖 ID - **内联检查**: 验证目标节点 data_id 完整性,失败则设置 `PRECONDITION_FAILED` - **FAILED 保护**: 自动跳过 `status=FAILED` 的节点 - 详见 [状态定义规范 § 4.A](./状态定义规范.md) --- ## 4. 数据源层 (Layer 2: DataSource) 作为各个后端的适配器,负责数据加载与持久化。 - **职责**: - `load_nodes(node_type)`: 从后端加载并返回 `SyncNode` 集合,自动添加到 `DataCollection`。 - `save_nodes(nodes)`: - 遍历节点,仅处理 `status == PENDING` 且 `action != NONE` 的节点。 - 根据 `action` 执行相应的 CREATE/UPDATE/DELETE 操作。 - 执行成功后,更新节点的 `status` 和相关信息(如新生成的 remote_id)。 --- ## 5. 编排层 (Layer 3: Pipeline) 最高层级,负责流程编排。 - **职责**: - **显式顺序**: 直接在代码中按顺序调用同步逻辑(例如:先同步项目,再同步合同)。 - **故障传播**: 若前置实体某节点同步失败(`FAILED`),编排器在处理后续依赖节点时可将其标记为 `DEPENDENCY_ERROR`。 - **生命周期管理**: 初始化 `BindingManager` 和 `DataCollection`,同步结束后调用持久化方法。 --- ## 6. ID 映射与对齐:核心流程 为了解决本地数据引用本地 ID 与远程数据引用远程 ID 的冲突,系统采用以下映射逻辑: ### 绑定阶段 (Binding) - **时机**: `Strategy.bind` - **目标**: 在 `BindingManager` 中确定 local_id ↔ remote_id 映射 - **手段**: 业务键匹配(如 Code 匹配)、历史记录恢复等 ### 执行阶段 (Execution) - **时机**: `Strategy.create()` / `Strategy.update()` 阶段 - **目标**: 在创建新节点或准备更新时,将依赖字段的本地 ID 替换为远程 ID - **手段**: - `create()`: 创建对方节点时,复制数据并替换所有依赖 ID - `update()`: 准备更新数据时,替换数据中的依赖 ID - **验证**: `_pre_commit_check` 在 create/update 最后检查,确保所有依赖节点都已有远程 ID **注意**: ID 替换在 Strategy 的 create/update 阶段完成,DataSource 只负责盲目执行已准备好的数据。 --- ## 7. 关键设计原则 - **删除类型依赖配置**: 依赖关系通过 `Pipeline` 中的代码调用顺序自然表达。 - **无状态 DataSource**: 数据源不了解绑定逻辑,只看到 `action`、`status` 和 `binding_status`。 - **BindingManager 为核心**: 负责 ID 空间映射和持久化。 - **配置驱动**: 通过 `StrategyConfig` 和预设配置(ConfigPresets)灵活控制同步行为。