datai/docs/archive/decisions/adr/0019-destructive-changes.md

11 KiB
Raw Permalink Blame History

架构决策记录 - Destructive Changes功能实现

背景

REQ-010-10 要求实现 Destructive Changes 功能,支持部署时删除指定的元数据组件,使用 destructiveChanges.xml 配置删除规则。Destructive Changes 是 Salesforce Metadata API 提供的一个特殊功能,允许用户在部署时删除指定的元数据组件,如 Custom Object、Custom Field、Apex Class、Visualforce Page 等。

当前系统已经实现了元数据部署核心功能REQ-010-8包括手动触发部署、异步部署执行、状态监控、部署历史记录、部署进度查询、部署取消功能和部署结果解析。Destructive Changes 功能需要基于现有的部署核心功能,提供删除元数据组件的能力。

决策

1. destructiveChanges.xml 配置方案

决策: 使用 XML 解析库处理 destructiveChanges.xml提供可视化编辑器支持多种元数据类型配置和通配符配置。

理由:

  • XML 是 Salesforce Metadata API 的标准配置格式,易于理解和维护
  • 可视化编辑器可以提高用户体验,降低配置错误率
  • 支持多种元数据类型配置,满足不同的删除需求
  • 支持通配符配置,提高配置灵活性
  • XML 解析库可以方便地解析和验证 destructiveChanges.xml

实现方案:

  • 创建 DestructiveChangesConfigService 服务接口
  • 创建 DestructiveChangesConfigServiceImpl 服务实现
  • 使用 Java XML 解析库(如 JAXB 或 DOM4J处理 destructiveChanges.xml
  • 提供可视化编辑器,支持添加、删除、修改删除规则
  • 提供验证功能,验证 destructiveChanges.xml 格式和删除规则

2. Destructive Changes 部署方案

决策: 使用 RESTful API 接口实现 Destructive Changes 部署,调用 MetadataApiClient 的 deploy() 方法,传入 destructiveChanges.xml。

理由:

  • RESTful API 是标准的接口设计模式,易于使用和理解
  • 可以与前端组件无缝集成
  • 支持多种客户端Web、移动端、第三方应用
  • 符合项目现有的 API 设计规范
  • 基于现有的部署核心功能,复用 deploy() 方法

实现方案:

  • 创建 DestructiveChangesController 控制器
  • 提供 POST /metadata/destructive-changes/deploy 接口
  • 接收任务ID、组织配置ID和 destructiveChanges.xml 作为参数
  • 调用 MetadataApiService 的 deployDestructiveChangesAsync() 方法
  • 返回 Job ID 和初始状态

3. Destructive Changes 验证方案

决策: 使用 XML 解析库验证 destructiveChanges.xml 格式,使用正则表达式验证删除规则,提供详细的错误信息。

理由:

  • XML 解析库可以方便地验证 destructiveChanges.xml 格式
  • 正则表达式可以灵活地验证删除规则,适应不同的元数据类型
  • 详细的错误信息可以帮助用户快速定位和解决问题
  • 与现有的验证机制保持一致的设计模式
  • 易于扩展和维护

实现方案:

  • 使用 Java XML 解析库(如 JAXB 或 DOM4J验证 destructiveChanges.xml 格式
  • 使用正则表达式验证删除规则
  • 提供详细的错误信息,包括错误位置和错误原因
  • 支持批量验证,提高验证效率

4. Destructive Changes 历史记录方案

决策: 使用 MyBatis Plus 的 BaseMapper 实现 Destructive Changes 历史记录查询,支持分页查询和条件查询。

理由:

  • MyBatis Plus 是项目现有的持久层框架,符合技术栈要求
  • BaseMapper 提供了丰富的查询方法,易于使用
  • 支持分页查询,避免一次性加载大量数据
  • 支持条件查询,灵活满足不同的查询需求
  • 与现有的部署历史记录保持一致的设计模式

实现方案:

  • 使用 DataiMetaJobExecution 表存储 Destructive Changes 历史记录
  • 使用 jobType 字段区分 Destructive Changes 和普通部署
  • 使用 MyBatis Plus 的 BaseMapper 实现查询
  • 使用 Page 对象实现分页查询
  • 使用 QueryWrapper 实现条件查询

5. Destructive Changes 回滚方案

决策: 使用备份的元数据组件进行回滚,使用事务确保回滚原子性,提供回滚日志记录。

理由:

  • 备份的元数据组件可以确保回滚的完整性和准确性
  • 事务可以确保回滚的原子性,避免部分回滚导致数据不一致
  • 回滚日志记录可以追踪回滚历史,便于审计和问题排查
  • 与现有的部署机制保持一致的设计模式
  • 易于扩展和维护

实现方案:

  • 在删除元数据组件之前,先备份元数据组件
  • 使用事务确保回滚的原子性
  • 提供回滚日志记录,记录回滚的详细信息
  • 支持批量回滚,提高回滚效率
  • 提供回滚验证功能,验证回滚的完整性

备选方案

方案 1: 使用 JSON 格式配置删除规则

优点:

  • JSON 格式更简洁,易于读写
  • JSON 解析库性能更好
  • 更适合前端处理

缺点:

  • 不符合 Salesforce Metadata API 的标准格式
  • 需要额外的转换逻辑
  • 与 Salesforce 官方文档不一致

未选择原因: XML 是 Salesforce Metadata API 的标准配置格式,使用 JSON 格式会增加额外的转换逻辑,不符合官方规范。

方案 2: 使用数据库存储删除规则

优点:

  • 易于查询和管理
  • 支持复杂查询
  • 易于扩展

缺点:

  • 不符合 Salesforce Metadata API 的标准格式
  • 需要额外的转换逻辑
  • 与 Salesforce 官方文档不一致

未选择原因: XML 是 Salesforce Metadata API 的标准配置格式,使用数据库存储会增加额外的转换逻辑,不符合官方规范。

方案 3: 不提供回滚功能

优点:

  • 简化实现,降低复杂度
  • 减少存储开销
  • 提高性能

缺点:

  • 删除操作不可逆,风险高
  • 无法恢复误删除的数据
  • 不符合最佳实践

未选择原因: 删除操作不可逆风险太高,必须提供回滚功能,确保数据安全。

影响

系统架构影响

  • 新增模块: DestructiveChangesController、IDestructiveChangesService、DestructiveChangesServiceImpl、IDestructiveChangesConfigService、DestructiveChangesConfigServiceImpl
  • 现有模块: MetadataApiClient 需要支持传入 destructiveChanges.xml
  • 数据库: 使用现有的 DataiMetaJobExecution 表,新增字段存储备份信息
  • API: 新增 5 个 RESTful API 接口

开发流程影响

  • 开发工作量: 中等,复用现有的部署核心功能代码
  • 测试工作量: 高,需要测试删除和回滚的各种场景
  • 文档工作量: 中等,需要编写配置说明和使用文档

运维管理影响

  • 部署复杂度: 低,与现有部署流程一致
  • 监控复杂度: 低,复用现有的监控机制
  • 日志复杂度: 中等,需要记录删除和回滚的详细日志

风险

技术风险

  • 删除操作风险: 删除操作不可逆可能导致数据丢失
    • 缓解措施: 提供备份和回滚功能,使用事务确保删除和回滚的原子性
  • 验证风险: 验证逻辑不完善可能导致误删除
    • 缓解措施: 仔细验证 destructiveChanges.xml 格式和删除规则,提供详细的错误信息
  • 回滚风险: 回滚功能不完善可能导致无法恢复
    • 缓解措施: 使用备份的元数据组件进行回滚,使用事务确保回滚的原子性,提供回滚验证功能

业务风险

  • 数据丢失风险: 删除操作可能导致数据丢失
    • 缓解措施: 提供备份和回滚功能,记录详细的删除和回滚日志
  • 误删除风险: 验证不完善可能导致误删除
    • 缓解措施: 提供详细的错误信息,支持预验证功能
  • 回滚失败风险: 回滚功能不完善可能导致无法恢复
    • 缓解措施: 使用事务确保回滚的原子性,提供回滚验证功能

实施风险

  • 依赖风险: 依赖于 REQ-010-1, REQ-010-2, REQ-010-8
    • 缓解措施: 确保依赖的需求已经完成,避免依赖问题

回滚策略

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

  1. 禁用 Destructive Changes 功能: 通过配置开关禁用 Destructive Changes 功能,回退到普通部署
  2. 删除 Destructive Changes 相关代码: 删除 DestructiveChangesController、IDestructiveChangesService、DestructiveChangesServiceImpl、IDestructiveChangesConfigService、DestructiveChangesConfigServiceImpl 等代码
  3. 清理 Destructive Changes 历史记录: 清理 DataiMetaJobExecution 表中的 Destructive Changes 记录
  4. 恢复 API: 删除 Destructive Changes 相关的 API 接口
  5. 恢复备份: 使用备份的元数据组件恢复被删除的数据

验收标准

功能验收标准

  • destructiveChanges.xml 配置成功,支持可视化编辑
  • destructiveChanges.xml 格式符合 Salesforce Metadata API 规范
  • 支持多种元数据类型配置
  • 支持通配符配置
  • destructiveChanges.xml 验证功能正常工作
  • Destructive Changes 部署成功,支持删除指定的元数据组件
  • 支持批量删除
  • 删除操作安全可靠
  • API 接口符合 RESTful 规范
  • Destructive Changes 验证功能正常工作
  • destructiveChanges.xml 格式验证正确
  • 删除规则验证正确
  • 验证失败返回详细错误信息
  • Destructive Changes 历史记录成功
  • 支持分页查询
  • 支持条件查询
  • 历史记录完整
  • Destructive Changes 回滚功能正常工作
  • 支持恢复被删除的元数据组件
  • 回滚操作安全可靠
  • 回滚日志记录完整

性能验收标准

  • destructiveChanges.xml 配置响应时间 < 1s
  • Destructive Changes 部署触发响应时间 < 1s
  • Destructive Changes 验证响应时间 < 500ms
  • Destructive Changes 历史记录查询响应时间 < 1s
  • Destructive Changes 回滚响应时间 < 2s

代码质量验收标准

  • 代码符合项目编码规范,有清晰的注释
  • 单元测试覆盖率 > 80%
  • 集成测试通过率 100%
  • 无严重的代码质量问题

视觉锚点

Visual Reference

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

Status

  • Draft
  • Accepted
  • Superceded

参考资料

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