taskgenius_taskgenius-plugin/docs/filesource-architecture-review.md
Quorafind 172e5fc794 fix(dataflow): resolve data loss on restart and integrate FileSource
Implemented smart persistence batching in Repository to fix data loss issue that occurred
when Obsidian restarted. The Repository.updateFile() method now schedules persistence
operations with intelligent debouncing (1s delay, max 10 files, max 5s interval).

- Added persistence queue management with schedulePersist() and executePersist() methods
- Integrated FileSource into DataflowOrchestrator with conditional initialization
- Added FILE_TASK_UPDATED and FILE_TASK_REMOVED events to event system
- Extended Repository to support three data sources (regular tasks, ICS events, file tasks)
- Ensured cleanup properly persists pending data before shutdown
- Updated dataflow architecture documentation with FileSource details
- Added comprehensive FileSource architecture review document

The persistence fix ensures all task updates are properly saved to storage while
balancing performance through batching. FileSource integration allows files to be
recognized as tasks based on configurable strategies.
2025-08-21 07:12:36 +08:00

4.7 KiB
Raw Blame History

FileSource 架构审查报告

概述

FileSource 是一个新实现的数据源组件,用于将文件识别为任务并集成到 dataflow 架构中。本报告审查了 FileSource 的设计实现,并评估了其与现有 dataflow 架构的集成情况。

当前状态

已实现功能

  1. 文件识别策略

    • 基于元数据frontmatter的识别
    • 基于标签的识别
    • 模板和路径策略(预留接口)
    • 灵活的状态映射系统
  2. 事件处理

    • 订阅 FILE_UPDATED 事件
    • 发射 file-task-updated 和 file-task-removed 事件
    • 防抖机制300ms避免频繁更新
  3. 缓存管理

    • FileTaskCache 跟踪文件任务状态
    • FrontmatterHash 用于变更检测
    • 统计信息跟踪

待集成部分

FileSource 已完全实现但尚未集成到 DataflowOrchestrator 中。需要的集成步骤包括:

  1. 在 Orchestrator 构造函数中初始化 FileSource
  2. 订阅 FILE_TASK_UPDATED 和 FILE_TASK_REMOVED 事件
  3. 扩展 Repository 以处理文件任务
  4. 更新 QueryAPI 以合并文件任务到查询结果

架构设计评估

优点

  1. 模块化设计FileSource 完全独立,遵循 dataflow 的数据源模式
  2. 配置灵活性:通过 FileSourceConfig 提供丰富的配置选项
  3. 性能优化:实现了防抖、缓存和增量更新机制
  4. 事件驱动:与现有事件系统良好集成

潜在问题与建议

1. 重复计算问题

问题FileSource 在处理文件时需要获取项目数据,这可能与 Orchestrator 的处理产生重复。

分析

  • FileSource 独立获取项目数据(通过 project/Resolver
  • Orchestrator 也会为同一文件获取项目数据
  • 但由于 ProjectDataCache 的存在,实际不会产生重复计算

建议

  • 当前设计可接受,缓存机制有效避免了重复计算
  • 未来可考虑通过事件传递项目数据,进一步优化

2. 事件循环风险

问题FileSource 订阅 FILE_UPDATED 事件,可能与 ObsidianSource 产生冲突。

分析

  • FileSource 监听 FILE_UPDATED 来识别文件任务
  • ObsidianSource 发射 FILE_UPDATED 事件
  • 存在潜在的事件循环风险

建议

  • 使用序列号Seq机制防止循环
  • FileSource 应忽略自己触发的更新
  • 考虑使用不同的事件通道避免冲突

3. 数据合并策略

问题:文件任务与普通任务如何在 Repository 中合并?

当前设计缺陷

  • Repository 当前只处理文件内的任务和 ICS 事件
  • 没有专门处理文件级任务的机制
  • QueryAPI 需要扩展以合并三种数据源

建议

// Repository 扩展建议
class Repository {
  private fileTasks: Map<string, Task> = new Map(); // 新增:文件任务存储
  
  async updateFileTask(filePath: string, task: Task): Promise<void> {
    this.fileTasks.set(filePath, task);
    // 发射更新事件
  }
  
  async all(): Promise<Task[]> {
    const regularTasks = await this.indexer.getAllTasks();
    const fileTaskArray = Array.from(this.fileTasks.values());
    return [...regularTasks, ...this.icsEvents, ...fileTaskArray];
  }
}

4. 性能考虑

问题:初始扫描可能处理大量文件。

当前实现

  • 同步处理所有文件
  • 没有批处理或并行处理

建议

  • 实现批处理机制
  • 考虑使用 Worker 进行并行处理
  • 添加进度报告机制

集成路线图

第一阶段:基础集成

  1. 在 Orchestrator 中初始化 FileSource
  2. 添加事件监听器
  3. 扩展 Repository 支持文件任务
  4. 更新 QueryAPI 合并逻辑

第二阶段:优化

  1. 实现批处理和并行扫描
  2. 优化项目数据传递
  3. 添加更多识别策略(模板、路径)
  4. 实现智能更新检测

第三阶段:高级功能

  1. 支持文件任务的子任务
  2. 实现文件任务的双向同步
  3. 添加文件任务的特殊视图
  4. 支持文件任务的批量操作

结论

FileSource 的实现质量良好,遵循了 dataflow 架构的设计原则。主要需要关注的是:

  1. 集成工作:需要将 FileSource 正式集成到 Orchestrator 中
  2. 数据合并Repository 需要扩展以正确处理三种数据源
  3. 性能优化:大规模文件扫描需要优化
  4. 避免冲突:确保与现有系统的事件处理不产生冲突

通过 ProjectDataCache 的缓存机制重复计算的担忧已得到有效解决。FileSource 的设计是合理的,只需完成集成工作即可投入使用。

建议的下一步行动

  1. 完成 FileSource 与 Orchestrator 的集成
  2. 扩展 Repository 以支持文件任务存储
  3. 更新 QueryAPI 的查询逻辑
  4. 添加集成测试确保三种数据源正确合并
  5. 优化初始扫描性能
  6. 更新用户文档说明新功能