5.5 KiB
5.5 KiB
架构分层设计:四层模型
本架构旨在将同步系统的数据容器、同步逻辑、执行层与编排流程完全解耦,提供极简且类型安全的开发体验。
1. 架构概览
系统分为四层,依赖关系严格从上到下:
- 通用层 (Common): 定义纯数据结构(Data Container)和基础工具。
- 同步系统层 (Sync System): 定义同步行为接口(SyncStrategy)与业务规则。
- 数据源层 (DataSource): 实现数据的加载与持久化,属于盲目执行层。
- 编排层 (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
binding_status: 绑定状态 (UNCHECKED, NORMAL, MISSING, DEPENDENCY_ERROR, ABNORMAL, WARNING)。- 详见 状态定义规范 § 1
error: 异常详情。
- DataCollection: 节点的集合,提供类型安全的查询和过滤方法。
- BindingManager:
- ID 映射: 维护
local_node_id<->remote_node_id的双向映射。 - 绑定键: 使用
node_id作为绑定记录的键,一致不变。CREATE 成功后只更新节点的data_id,绑定记录不变。 - 持久化: 将映射关系持久化到存储(如 JSON/数据库)。
- ID 映射: 维护
- Enums:
SyncAction,SyncStatus,BindingStatus等。
3. 同步系统层 (Layer 1: Sync System)
核心业务逻辑层。通过实现 SyncStrategy 接口来定义特定实体的同步逻辑。
- SyncStrategy[T] 接口:
bind():- 职责:判定
binding_status(NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR) - 详见 状态定义规范 § 1-3
- 职责:判定
create():- 职责:处理孤儿节点(MISSING),在对方侧创建新节点并设置
action=CREATE - ID 替换: 创建新节点时,复制数据并将依赖字段的本地 ID 替换为远程 ID
- 内联检查: 通过
IDResolver.resolve_and_validate()验证依赖 ID 解析 - 详见 状态定义规范 § 4.C
- 职责:处理孤儿节点(MISSING),在对方侧创建新节点并设置
update():- 职责:处理差异节点(NORMAL 且有 diff),设置
action=UPDATE - ID 替换: 准备更新数据时,替换数据中的依赖 ID
- 内联检查: 验证目标节点 data_id 完整性,失败则设置
PRECONDITION_FAILED - FAILED 保护: 自动跳过
status=FAILED的节点 - 详见 状态定义规范 § 4.A
- 职责:处理差异节点(NORMAL 且有 diff),设置
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(): 创建对方节点时,复制数据并替换所有依赖 IDupdate(): 准备更新数据时,替换数据中的依赖 ID
- 验证:
_pre_commit_check在 create/update 最后检查,确保所有依赖节点都已有远程 ID
注意: ID 替换在 Strategy 的 create/update 阶段完成,DataSource 只负责盲目执行已准备好的数据。
7. 关键设计原则
- 删除类型依赖配置: 依赖关系通过
Pipeline中的代码调用顺序自然表达。 - 无状态 DataSource: 数据源不了解绑定逻辑,只看到
action、status和binding_status。 - BindingManager 为核心: 负责 ID 空间映射和持久化。
- 配置驱动: 通过
StrategyConfig和预设配置(ConfigPresets)灵活控制同步行为。