# DataSource 接入说明 本文档说明当前 `sync_state_machine.datasource` 层的职责边界,以及新增 datasource / handler 时应如何接入。 如需看完整库化接入方式,优先参考 [docs/library_integration_guide.md](../../docs/library_integration_guide.md)。 ## 1. 分层模型 当前 datasource 层分为两部分: 1. `DataSource` - 管理 handler 注册 - 管理 collection 注入 - 负责按 `node_type` 组织 `load_all()` / `sync_all()` - 汇总并回写 `TaskResult` 2. `Handler` - 负责某一个 `node_type` 的具体 I/O - 负责把原始数据转成 `SyncNode` - 负责执行 create / update / delete / poll 设计原则: - datasource 不承载业务策略 - strategy 不直接做底层 I/O - 节点类型差异下沉到 handler --- ## 2. 当前可直接复用的 datasource ### 2.1 JSONL - `JsonlDataSource` - `BaseJsonlHandler` 适合: - fixture - 本地回放 - 离线调试 ### 2.2 API - `ApiDataSource` - `ApiClient` - `BaseApiHandler` 适合: - HTTP 推送 - 异步任务轮询 - 远端系统对接 --- ## 3. 最推荐的扩展方式:只新增 handler 多数情况下,不需要新增新的 datasource 类。 推荐做法: 1. 复用现有 `JsonlDataSource` 或 `ApiDataSource` 2. 为你的 `node_type` 新增 handler 3. 在 handler 中完成字段映射、加载、写入和轮询 4. 将 handler 注册到 `DomainRegistry` 这样可以保持: - pipeline 不变 - datasource 生命周期不变 - 策略层不感知底层来源 --- ## 4. handler 需要实现什么 ### 4.1 JSONL handler 通常继承 `BaseJsonlHandler`: ```python class DemoJsonlHandler(BaseJsonlHandler): def __init__(self, datasource): super().__init__( datasource=datasource, node_type="demo", node_class=DemoSyncNode, schema=DemoSchema, ) ``` ### 4.2 API handler 通常继承 `BaseApiHandler`,实现: - `load()` - `create_all()` - `update_all()` - `delete_all()` - `poll_tasks()` 并按需要补充: - `extract_created_id()` - `get_update_fields()` - 依赖节点 context 读取逻辑 --- ## 5. 什么时候新增 DataSource 类 只有在现有 JSONL / API 模型都不匹配时,才建议新增 `BaseDataSource` 子类。 例如: - 数据来自数据库快照 - 数据来自 MQ / Kafka - 数据来自特殊 RPC 或 SDK 即便新增 datasource,也建议保留同样的职责边界: - datasource 负责调度 - handler 负责节点类型差异 --- ## 6. 注册方式 接入新 `node_type` 时,最终仍通过 `DomainRegistry` 暴露给 pipeline: ```python DomainRegistry.register( node_type="demo", schema=DemoSchema, node_class=DemoSyncNode, strategy_class=DemoStrategy, jsonl_handler_class=DemoJsonlHandler, api_handler_class=DemoApiHandler, ) ``` --- ## 7. 推荐阅读顺序 1. [docs/library_integration_guide.md](../../docs/library_integration_guide.md) 2. `sync_state_machine/datasource/handler.py` 3. `sync_state_machine/datasource/api/handler.py` 4. `sync_state_machine/datasource/jsonl/handler.py` 5. `sync_state_machine/pipeline/factory.py` --- ## 8. 结论 如果你在接入新系统,优先判断: - 是否可以直接复用 `JsonlDataSource` / `ApiDataSource` - 是否只需要新增 handler - 是否需要在业务系统侧做 mapper / adapter 通常情况下,**先写 handler,而不是先写新的 datasource**。