Files
ecm_sync_system/docs/archive/from_root_docs/架构分层设计.md
T
strepsiades 4a9c444b10 first commit
2026-03-09 16:31:42 +08:00

5.5 KiB

架构分层设计:四层模型

本架构旨在将同步系统的数据容器同步逻辑执行层编排流程完全解耦,提供极简且类型安全的开发体验。


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)。
    • binding_status: 绑定状态 (UNCHECKED, NORMAL, MISSING, DEPENDENCY_ERROR, ABNORMAL, WARNING)。
    • 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():
    • create():
      • 职责:处理孤儿节点(MISSING),在对方侧创建新节点并设置 action=CREATE
      • ID 替换: 创建新节点时,复制数据并将依赖字段的本地 ID 替换为远程 ID
      • 内联检查: 通过 IDResolver.resolve_and_validate() 验证依赖 ID 解析
      • 详见 状态定义规范 § 4.C
    • update():
      • 职责:处理差异节点(NORMAL 且有 diff),设置 action=UPDATE
      • ID 替换: 准备更新数据时,替换数据中的依赖 ID
      • 内联检查: 验证目标节点 data_id 完整性,失败则设置 PRECONDITION_FAILED
      • FAILED 保护: 自动跳过 status=FAILED 的节点
      • 详见 状态定义规范 § 4.A

4. 数据源层 (Layer 2: DataSource)

作为各个后端的适配器,负责数据加载与持久化。

  • 职责:
    • load_nodes(node_type): 从后端加载并返回 SyncNode 集合,自动添加到 DataCollection
    • save_nodes(nodes):
      • 遍历节点,仅处理 status == PENDINGaction != NONE 的节点。
      • 根据 action 执行相应的 CREATE/UPDATE/DELETE 操作。
      • 执行成功后,更新节点的 status 和相关信息(如新生成的 remote_id)。

5. 编排层 (Layer 3: Pipeline)

最高层级,负责流程编排。

  • 职责:
    • 显式顺序: 直接在代码中按顺序调用同步逻辑(例如:先同步项目,再同步合同)。
    • 故障传播: 若前置实体某节点同步失败(FAILED),编排器在处理后续依赖节点时可将其标记为 DEPENDENCY_ERROR
    • 生命周期管理: 初始化 BindingManagerDataCollection,同步结束后调用持久化方法。

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: 数据源不了解绑定逻辑,只看到 actionstatusbinding_status
  • BindingManager 为核心: 负责 ID 空间映射和持久化。
  • 配置驱动: 通过 StrategyConfig 和预设配置(ConfigPresets)灵活控制同步行为。