datai/datai-scenes/datai-scene-salesforce/docs/decisions/2026-02-03-003-05-ADR-删除操作技术选型.md

3.6 KiB
Raw Permalink Blame History

ADR-003-05: 删除操作技术选型

状态

已接受

日期

2026-02-03

背景

元数据删除是 Salesforce Metadata API 的核心功能之一。需要支持按类型和名称删除元数据,支持批量操作,并记录删除历史。 在实现过程中,面临以下关键技术选择:

  1. 删除接口选择:使用同步的 deleteMetadata 接口还是基于文件部署的 deploy (destructiveChanges) 接口?
  2. 批量处理策略:如何处理超过 API 限制(通常为 10 个)的批量删除请求?
  3. 数据持久化策略:如何存储删除历史记录?

决策

决策 1使用同步 deleteMetadata 接口

选择方案:使用 Salesforce Metadata API 提供的同步 deleteMetadata 方法。

理由

  1. 简单高效:对于常见的删除操作(少量组件),同步调用能立即返回结果,无需轮询等待,用户体验更好。
  2. 符合需求:需求明确要求返回 DeleteResult 对象,这是 deleteMetadata 接口的标准返回值。
  3. 开发成本低:无需构建复杂的 ZIP 包或 destructiveChanges.xml 文件。
  4. 粒度控制:支持对每个组件的删除结果进行单独处理(成功/失败)。

放弃方案:使用 deploy 接口Destructive Changes

  • 理由:实现复杂(需构建 ZIP 包),异步执行需要轮询,对于简单的删除操作显得过于厚重。仅在需要大规模事务性删除或复杂依赖处理时才考虑使用。

决策 2客户端分批循环处理

选择方案:在 Service 层实现分批逻辑,循环调用 deleteMetadata

理由

  1. 规避限制Metadata API 的 deleteMetadata 单次调用通常限制为 10 个组件。通过 Service 层自动分批(如每批 10 个),可以透明地支持任意数量的删除请求。
  2. 结果聚合Service 层负责收集每一批的 DeleteResult,合并后统一返回给调用方,保持接口简洁。

决策 3数据库持久化删除历史

选择方案:将删除结果持久化到 MySQL 数据库表 datai_metadata_delete

理由

  1. 审计需求:满足对元数据变更操作的审计要求,记录谁在什么时候删除了什么。
  2. 一致性与项目中其他模块如异步操作、Apex 测试执行)的持久化策略保持一致。
  3. 查询能力:数据库提供强大的查询能力,便于实现历史记录的分页查询和过滤。

后果

正面影响

  • 响应速度快:小批量删除操作可实时反馈结果。
  • 架构简单:无需引入复杂的异步任务队列或文件处理逻辑。
  • 可追溯:完整的数据库记录确保了操作的可追溯性。

负面影响

  • 大批量性能限制:如果是极大批量的删除(如上千个),同步循环调用可能会导致 HTTP 请求超时或执行时间过长。
    • 缓解措施:建议前端限制单次批量操作的数量,或在大批量场景下引导用户使用后续可能开发的异步部署功能。

替代方案

替代方案 1异步队列处理

  • 描述:将删除请求放入消息队列,后台异步执行。
  • 优点:支持高并发和大批量,不阻塞 Web 线程。
  • 缺点:增加了系统复杂度(队列、消费者),用户无法立即获得结果,需要前端轮询。
  • 适用场景:非实时、大规模的清理任务。

相关文档