datai/datai-scenes/datai-scene-salesforce/docs/decisions/adr/0002-sync-progress-tracking.md
Kris 85f71e1dc3 feat: 实现数据同步进度跟踪功能
- 新增 SyncProgress 实体类、ISyncProgressService 接口和 SyncProgressServiceImpl 实现类
- 在 DataiIntegrationObjectController 中添加 6 个进度查询接口:
  - 查询指定对象的同步进度
  - 查询所有正在同步的对象进度
  - 查询指定对象的插入进度
  - 查询所有正在插入的对象进度
  - 查询指定对象的更新进度
  - 查询所有正在更新的对象进度
- 在 DataiIntegrationObjectServiceImpl 中集成进度跟踪功能:
  - syncFullData 方法集成同步进度跟踪
  - syncIncrementalData 方法集成同步进度跟踪
  - insertObjectDataToTarget 方法集成插入进度跟踪
  - updateObjectDataToTarget 方法集成更新进度跟踪
- 进度信息存储在内存中(ConcurrentHashMap),任务完成后立即清除
- 新增 3 个需求文档(REQ-002、REQ-003、REQ-004)
- 新增 3 个架构决策记录(0002、0003、0004)
- 新增 3 个提示词文件(002、003、004)
- 新增 3 个会话记录
- 新增 3 个变更记录(0012、0013、0014)
- 新增 3 个复盘报告
- 新增 6 个 API 文档
- 更新 CHANGELOG.md 和 docs/index.md
2026-01-16 13:02:09 +08:00

212 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构决策记录syncObjectData 同步进度跟踪
## 背景
描述决策的背景和上下文,包括面临的问题、约束条件和相关的业务需求。
当前 syncObjectData 方法在执行同步操作时,用户无法获知同步的实际进度,只能等待同步完成。这导致用户体验不佳,特别是在处理大量数据时,用户无法判断同步是否正常进行、还需要多长时间完成。根据 [REQ-002.md](../../requirements/REQ-002.md) 需求文档,需要实现同步进度的实时跟踪和查询功能,提升用户体验和系统透明度。
## 决策
明确陈述所做出的架构决策,包括具体的技术选择、设计方案或实现策略。
1. **采用内存存储方案ConcurrentHashMap**
- 使用 `ConcurrentHashMap` 作为进度信息的存储容器
- Key 为对象 IDIntegerValue 为进度对象SyncProgress
- 利用 ConcurrentHashMap 的线程安全特性,支持并发访问
- 进度信息存储在内存中,访问速度快,响应时间 < 10ms
- **不将同步进度数据同步到数据库**避免数据库写入开销提升性能
2. **进度信息数据结构设计**
- 创建 `SyncProgress` 实体类包含以下字段
- `objectId`: 对象 ID
- `syncType`: 同步类型全量/增量
- `totalBatches`: 总批次数量
- `processedBatches`: 已处理批次数量
- `currentBatch`: 当前批次
- `progressPercentage`: 进度百分比0-100
- `startTime`: 开始时间
- `endTime`: 结束时间
- `status`: 状态RUNNINGCOMPLETEDFAILED
- `errorMessage`: 错误信息如果有
3. **进度跟踪服务设计**
- 创建 `ISyncProgressService` 接口定义进度跟踪的核心方法
- `startProgressTracking(objectId, totalBatches, syncType)`: 开始进度跟踪
- `updateProgress(objectId, processedBatches, currentBatch)`: 更新进度
- `completeProgress(objectId)`: 完成进度跟踪并立即清除该同步进度信息
- `failProgress(objectId, errorMessage)`: 标记进度失败并立即清除该同步进度信息
- `getProgress(objectId)`: 获取进度信息
- `getAllProgress()`: 获取所有进度信息
- 创建 `SyncProgressServiceImpl` 实现类使用 ConcurrentHashMap 存储进度信息
- 在同步任务完成或失败时立即清除该同步进度信息不保留历史记录
4. **进度查询接口设计**
- `DataiIntegrationObjectController` 中添加进度查询接口
- `GET /integration/object/progress/{objectId}`: 查询指定对象的同步进度
- `GET /integration/object/progress`: 查询所有正在同步的对象进度
- 返回 JSON 格式的进度信息
5. **与现有 syncObjectData 方法的集成**
- `DataiIntegrationObjectServiceImpl` 中注入 `ISyncProgressService`
- syncObjectData 方法开始时调用 `startProgressTracking`
- 在同步过程中调用 `updateProgress` 更新进度
- 在同步完成时调用 `completeProgress`该方法会立即清除进度信息
- 在同步失败时调用 `failProgress`该方法会立即清除进度信息
## 备选方案
列出考虑过的其他备选方案包括每种方案的优缺点
1. **Redis 缓存方案**
- **优点**
- 支持分布式部署多个服务实例可以共享进度信息
- 数据持久化系统重启后进度信息不丢失
- Redis 性能优秀响应时间 < 1ms
- 支持自动过期机制无需手动清理
- **缺点**
- 需要额外部署 Redis 服务增加运维成本
- 增加系统依赖Redis 故障会影响进度查询
- 网络开销相比内存存储稍慢
- 需要额外的序列化/反序列化操作
2. **数据库存储方案**
- **优点**
- 数据持久化系统重启后进度信息不丢失
- 支持分布式部署多个服务实例可以共享进度信息
- 可以利用现有的数据库基础设施
- 支持复杂查询和历史记录
- **缺点**
- 数据库写入开销大影响同步性能
- 需要创建新的进度表增加数据库维护成本
- 响应时间较慢10-100ms用户体验不佳
- 频繁的数据库操作可能导致锁竞争
3. **内存存储方案ConcurrentHashMap**
- **优点**
- 实现简单无需额外依赖
- 访问速度快响应时间 < 10ms
- 线程安全支持并发访问
- 无网络开销性能最优
- 同步任务完成后立即清除进度信息无需额外的清理机制
- **缺点**
- 数据存储在内存中系统重启后进度信息丢失
- 不支持分布式部署多个服务实例无法共享进度信息
- 不保留历史记录无法查询已完成的同步进度
## 影响
分析该决策对系统架构开发流程运维管理等方面的影响
1. **系统架构影响**
- 引入进度跟踪服务层增加系统模块化程度
- 不影响现有的同步逻辑通过依赖注入方式集成
- 内存存储方案简单不增加系统复杂性
- 与现有的 ADR-0001Salesforce CDC 同步方案不冲突
2. **开发流程影响**
- 需要创建新的服务接口和实现类
- 需要修改现有的 syncObjectData 方法集成进度跟踪
- 需要创建新的进度查询接口
- 开发工作量适中预计 2-3 天完成
3. **运维管理影响**
- 无需额外部署服务不增加运维成本
- 无需监控内存泄漏风险进度信息在同步完成后立即清除
- 无需定时清理任务简化运维管理
- 系统重启后进度信息丢失需要告知用户
4. **性能影响**
- 进度更新操作轻量级对同步性能影响 < 5%
- 进度查询响应时间 < 10ms用户体验良好
- 内存占用可控每个进度对象约 200 字节100 个并发同步约 20KB
## 风险
识别该决策可能带来的风险包括技术风险业务风险和实施风险
1. **技术风险**
- 系统重启后进度信息丢失用户需要重新查询
- 并发同步多个对象时可能出现进度信息不一致
- 进度更新频率过高可能影响同步性能
2. **业务风险**
- 用户可能依赖进度信息做决策系统重启可能导致信息丢失
- 进度信息不准确可能影响用户体验
- 大量并发同步时内存占用可能过高
3. **实施风险**
- 修改现有的 syncObjectData 方法可能引入 bug
- 进度跟踪逻辑与同步逻辑耦合可能影响代码可维护性
- 测试覆盖不充分可能导致线上问题
## 回滚策略
描述如果决策实施后出现问题如何进行回滚或调整
1. **回滚步骤**
- 移除 syncObjectData 方法中的进度跟踪调用
- 注释掉进度查询接口
- 保留进度跟踪服务代码但不使用
2. **调整策略**
- 降低进度更新频率减少性能影响
- 优化进度查询接口增加缓存机制
- 考虑切换到 Redis 缓存方案如果分布式部署需求增加
3. **应急方案**
- 提供同步日志查询功能作为进度信息的补充
- 增加同步状态监控及时发现同步异常
- 提供手动触发同步的功能作为自动同步的补充
## 验收标准
定义验证该决策有效性的具体标准和测试方法
1. **功能验收**
- syncObjectData 方法执行时进度信息能够正确初始化和更新
- 进度查询接口能够返回准确的进度信息
- 进度信息包含所有必需的字段objectIdsyncTypetotalBatchesprocessedBatchescurrentBatchprogressPercentagestartTimeendTimestatuserrorMessage
- 同步完成后进度状态正确标记为 COMPLETED
- 同步失败时进度状态正确标记为 FAILED并记录错误信息
2. **性能验收**
- 进度查询接口响应时间 < 100ms
- 进度更新操作对同步性能影响 < 5%
- 支持 10 个对象同时同步并跟踪进度
- 内存占用 < 100MB100 个并发同步
3. **可靠性验收**
- 并发访问时进度信息保持一致性
- 同步任务完成后进度信息能够正确清除
- 同步任务失败时进度信息能够正确清除
4. **用户体验验收**
- 进度信息准确实时易理解
- 进度百分比计算准确0-100%
- 错误信息清晰有用
## 视觉锚点
### Visual Reference
引用 Canvas 的具体节点或快照
- [Authentication.canvas](../../Authentication.canvas) - 项目架构视觉化展示
- **具体节点**: [DataiIntegrationObjectController](../../datai-salesforce-integration/src/main/java/com/datai/integration/controller/DataiIntegrationObjectController.java) - 对象同步控制接口
- **具体节点**: [DataiIntegrationObjectServiceImpl](../../datai-salesforce-integration/src/main/java/com/datai/integration/service/impl/DataiIntegrationObjectServiceImpl.java) - 对象同步服务实现
### Status
- [ ] Draft
- [x] Accepted
- [ ] Superceded
## 参考资料
列出与该决策相关的参考资料包括文档文章或其他资源
- [REQ-002.md](../../requirements/REQ-002.md) - syncObjectData 同步进度跟踪需求文档
- [0001-salesforce-cdc-sync.md](0001-salesforce-cdc-sync.md) - Salesforce CDC 同步方案
- [ConcurrentHashMap Java Documentation](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html)
- [Spring @Scheduled Annotation](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/Scheduled.html)