datai/datai-scenes/datai-scene-salesforce/docs/decisions/adr/0021-file-hash-comparison.md
Kris 2e6f087732 docs: 完成REQ-010-17和REQ-010-2的文档创建
- 完成REQ-010-17(性能优化和限流处理)的所有6个阶段
  - 创建ADR文档:0026-performance-optimization.md
  - 创建Prompt文档:027-performance-optimization.md
  - 创建会话记录:20260119-performance-optimization.md
  - 创建变更记录:20260119-performance-optimization.md
  - 创建复盘报告:20260119-performance-optimization-retro.md
  - 更新index.md和CHANGELOG.md

- 完成REQ-010-2(基础实体类和Mapper创建)的前3个阶段
  - 更新ADR文档:0011-entity-mapper-create.md
  - 创建Prompt文档:002-entity-mapper-create.md
  - 更新index.md

所有文档均按照SSOT方法论创建,包括需求定义、架构决策、提示词资产化、执行会话、变更记录和闭环复盘。
2026-01-19 10:06:09 +08:00

8.5 KiB
Raw Blame History

架构决策记录 - 文件哈希对比和增量检测

背景

在 Salesforce 元数据拉取和部署过程中,每次都拉取或部署所有文件会导致性能低下,特别是在元数据文件数量较多的情况下。为了提高性能,需要实现文件哈希对比和增量检测功能,只拉取或部署变化的文件。

当前系统已经实现了文件存储和解压处理REQ-010-7和元数据组件索引和查询REQ-010-11需要在此基础上实现文件哈希对比和增量检测功能。

决策

1. 文件哈希计算方案

决策: 使用 Java MessageDigest 计算 SHA-256 哈希,使用流式处理大文件。

理由:

  • SHA-256 是一种安全的哈希算法,能够准确识别文件变化
  • Java MessageDigest 是 Java 标准库的一部分,无需额外依赖
  • 流式处理可以避免一次性加载大文件到内存,降低内存使用

实现方案:

  • 创建 IFileHashService 服务接口
  • 创建 FileHashServiceImpl 服务实现
  • 使用 MessageDigest.getInstance("SHA-256") 获取 SHA-256 哈希算法实例
  • 使用 BufferedInputStream 流式读取文件,避免一次性加载大文件到内存
  • 使用 8KB 缓冲区,平衡内存使用和读取性能

2. 哈希对比方案

决策: 使用哈希值直接对比,使用并行处理提高对比性能。

理由:

  • 哈希值直接对比简单高效,能够准确识别文件变化
  • 并行处理可以利用多核 CPU 的优势,提高对比性能
  • 使用 Java 8 的 Stream API 可以方便地实现并行处理

实现方案:

  • 创建 IHashComparisonService 服务接口
  • 创建 HashComparisonServiceImpl 服务实现
  • 使用 String.equals() 方法对比哈希值
  • 使用 parallelStream() 并行处理多个文件
  • 使用 ConcurrentHashMap 缓存哈希值,避免重复计算

3. 增量检测方案

决策: 使用哈希对比检测文件变化,使用文件系统监听器检测文件删除。

理由:

  • 哈希对比能够准确识别文件的新增和修改
  • 文件系统监听器能够实时检测文件删除
  • 结合两种方式可以全面检测文件变化

实现方案:

  • 创建 IIncrementalDetectionService 服务接口
  • 创建 IncrementalDetectionServiceImpl 服务实现
  • 使用哈希对比检测文件的新增和修改
  • 使用 Java NIO 的 WatchService 监听文件系统事件
  • 使用 ChangeType 枚举定义文件变化类型ADDED、MODIFIED、DELETED
  • 使用 FileChange 实体类记录文件变化信息

4. 增量拉取方案

决策: 使用增量检测结果构建 package.xml只拉取变化的文件。

理由:

  • package.xml 是 Salesforce Metadata API 的标准配置格式,易于理解和维护
  • 只拉取变化的文件可以减少网络传输和处理时间
  • 复用现有的 IMetadataRetrieveService 服务接口,保持代码一致性

实现方案:

  • 创建 IIncrementalRetrieveService 服务接口
  • 创建 IncrementalRetrieveServiceImpl 服务实现
  • 使用增量检测结果构建 package.xml
  • 调用 IMetadataRetrieveService 的 retrieve() 方法,传入 package.xml
  • 使用异步执行,避免阻塞主线程
  • 复用现有的 AsyncConfig 配置类和线程池

5. 增量部署方案

决策: 使用增量检测结果构建 package.xml只部署变化的文件。

理由:

  • package.xml 是 Salesforce Metadata API 的标准配置格式,易于理解和维护
  • 只部署变化的文件可以减少网络传输和处理时间
  • 复用现有的 IMetadataDeployService 服务接口,保持代码一致性

实现方案:

  • 创建 IIncrementalDeployService 服务接口
  • 创建 IncrementalDeployServiceImpl 服务实现
  • 使用增量检测结果构建 package.xml
  • 调用 IMetadataDeployService 的 deploy() 方法,传入 package.xml
  • 使用异步执行,避免阻塞主线程
  • 复用现有的 AsyncConfig 配置类和线程池

备选方案

备选方案 1: 使用文件修改时间对比

优点:

  • 实现简单,无需计算哈希值
  • 性能较高,无需读取文件内容

缺点:

  • 文件修改时间可能不准确,可能导致误判
  • 无法检测文件内容是否真的发生变化

结论: 不采用,因为文件修改时间可能不准确,无法保证增量检测的准确性。

备选方案 2: 使用 MD5 哈希算法

优点:

  • MD5 哈希计算速度快
  • 实现简单

缺点:

  • MD5 存在碰撞风险,安全性较低
  • 不符合安全最佳实践

结论: 不采用,因为 MD5 存在碰撞风险,安全性较低,不符合安全最佳实践。

备选方案 3: 使用第三方库计算哈希

优点:

  • 性能可能更高
  • 功能可能更丰富

缺点:

  • 增加依赖,增加项目复杂度
  • 可能存在安全风险

结论: 不采用,因为 Java 标准库已经提供了足够的功能,无需额外依赖。

影响

对系统架构的影响

  • 新增 file-hash 包包含文件哈希对比和增量检测相关的服务、控制器、DTO、实体、Mapper、工具类
  • 复用现有的 IFileStorageService 接口,用于读取文件内容
  • 复用现有的 IMetadataRetrieveService 服务接口,用于增量拉取
  • 复用现有的 IMetadataDeployService 服务接口,用于增量部署
  • 复用现有的 AsyncConfig 配置类和线程池,用于异步执行

对开发流程的影响

  • 开发人员需要了解文件哈希对比和增量检测的实现原理
  • 需要编写单元测试和集成测试,确保功能正常
  • 需要编写文档,说明如何使用文件哈希对比和增量检测功能

对运维管理的影响

  • 需要监控文件哈希计算和对比的性能
  • 需要监控增量拉取和部署的性能
  • 需要定期清理过期的哈希值,避免占用过多存储空间

风险

技术风险

  • 哈希计算风险: 哈希计算错误可能导致增量检测不准确
    • 缓解措施: 使用单元测试和集成测试验证哈希计算的准确性
  • 对比性能风险: 对比性能不佳可能影响用户体验
    • 缓解措施: 使用并行处理提高对比性能,使用缓存避免重复计算
  • 增量检测风险: 增量检测不准确可能导致遗漏或误判
    • 缓解措施: 使用哈希对比和文件系统监听器两种方式,全面检测文件变化

业务风险

  • 增量拉取风险: 增量拉取失败可能导致文件不一致
    • 缓解措施: 提供回滚机制,支持重新拉取所有文件
  • 增量部署风险: 增量部署失败可能导致部署不完整
    • 缓解措施: 提供回滚机制,支持重新部署所有文件

实施风险

  • 性能风险: 文件哈希计算和对比性能可能不满足要求
    • 缓解措施: 使用流式处理和并行处理提高性能
  • 兼容性风险: 新增功能可能与现有功能不兼容
    • 缓解措施: 充分测试,确保兼容性

回滚策略

如果决策实施后出现问题,可以采取以下回滚策略:

  1. 禁用增量检测: 在配置中禁用增量检测功能,回退到全量拉取和部署
  2. 重新计算哈希: 如果哈希计算出现问题,可以重新计算所有文件的哈希值
  3. 回退到全量操作: 如果增量拉取或部署失败,可以回退到全量拉取和部署

验收标准

定义验证该决策有效性的具体标准和测试方法:

  1. 功能完整性: 所有文件哈希对比和增量检测功能能够正常工作
  2. 性能指标: 哈希计算和对比性能满足要求,增量拉取和部署性能满足要求
  3. 准确性: 增量检测结果准确,只拉取或部署变化的文件
  4. 代码规范性: 代码符合项目编码规范,有清晰的注释
  5. 可维护性: 代码结构清晰,易于扩展和维护
  6. 可测试性: 代码易于单元测试和集成测试

视觉锚点

Visual Reference

引用 Canvas 的具体节点或快照:

Status

  • Draft
  • Accepted
  • Superceded

参考资料

列出与该决策相关的参考资料,包括文档、文章或其他资源: