# 架构决策记录 (ADR) 模板 ## 背景 在 Salesforce 集成项目中,需要实现元数据的拉取和部署功能,以支持不同环境间的元数据管理和同步。该功能需要支持全量/增量部署、验证、单元测试以及破坏性变更,提高元数据管理效率。 ## 决策 采用 Salesforce Metadata API 实现元数据拉取和部署功能,具体方案如下: 1. **技术栈选择**: - 使用 Salesforce Metadata API (SOAP) 进行元数据拉取和部署 - 使用 OAuth 2.0 进行身份认证 - 采用异步处理模式处理拉取和部署请求 - 使用 Quartz 框架实现定时任务 2. **架构设计**: - 分层架构:Controller 层 -> Service 层 -> Salesforce API 层 - 异步处理:拉取和部署操作异步执行,不阻塞请求线程 - 结果轮询:使用轮询机制获取异步操作结果 - 错误处理:详细记录错误信息,支持重试机制 3. **数据库设计**: - 参考文档中推荐的数据库设计,包括: - sf_org_config:存储 Salesforce 组织配置 - sf_metadata_task:定义拉取规则 - sf_job_execution:记录作业执行历史 - sf_metadata_component:记录元数据组件详情 - sf_deploy_history:记录部署历史 4. **核心功能实现**: - 元数据拉取:支持根据 package.xml 拉取指定元数据 - 元数据部署:支持全量/增量部署、验证、单元测试和破坏性变更 - 部署结果解析:详细解析部署结果,包括错误信息和代码覆盖率 - 快速部署:支持使用验证 ID 进行快速部署 ## 备选方案 ### 方案 1:使用 Salesforce CLI (SFDX) 命令行工具 **优点**: - 命令行工具成熟稳定,支持丰富的元数据操作 - 支持插件扩展,功能强大 - 社区活跃,文档丰富 **缺点**: - 需要在服务器上安装 SFDX CLI - 命令行调用复杂度高,错误处理困难 - 集成到 Java 应用中不够优雅 - 性能和并发处理能力有限 ### 方案 2:使用第三方库封装的 Metadata API **优点**: - 封装了复杂的 API 调用细节 - 提供更简洁的 API 接口 - 支持异步处理和结果轮询 **缺点**: - 依赖第三方库,存在版本兼容风险 - 功能可能不够全面,需要自行扩展 - 学习成本较高 ## 影响 1. **系统架构**: - 增加元数据管理模块,扩展系统功能 - 引入异步处理机制,提高系统响应能力 - 增加数据库表,扩展数据模型 2. **开发流程**: - 需要熟悉 Salesforce Metadata API - 增加异步编程复杂度 - 需要实现详细的错误处理和日志记录 3. **运维管理**: - 需要监控元数据拉取和部署任务 - 需要管理 Salesforce API 调用限制 - 需要处理异步任务的失败和重试 ## 风险 1. **技术风险**: - Salesforce API 版本变更可能导致兼容性问题 - 异步处理机制可能引入复杂的并发问题 - 元数据依赖关系处理复杂,可能导致部署失败 2. **业务风险**: - 部署失败可能影响业务系统正常运行 - 元数据冲突可能导致数据不一致 - API 调用限制可能影响系统性能 3. **实施风险**: - 开发和测试周期较长 - 需要大量的测试用例验证功能 - 需要培训开发人员熟悉相关技术 ## 回滚策略 1. **功能回滚**: - 对于部署失败的元数据,支持回滚到之前的版本 - 保存部署前的元数据快照,用于回滚 - 实现手动和自动回滚机制 2. **系统回滚**: - 如果新功能引入严重问题,支持禁用元数据管理模块 - 保持系统核心功能不受影响 - 提供紧急回滚脚本 ## 验收标准 1. **功能验证**: - 成功拉取 Salesforce 元数据 - 成功部署元数据到目标组织 - 支持全量/增量部署、验证、单元测试和破坏性变更 - 提供详细的部署结果和错误信息 - 支持使用验证 ID 进行快速部署 2. **性能验证**: - 拉取和部署操作异步处理,不阻塞请求线程 - 支持并发处理多个拉取和部署任务 - 满足 Salesforce API 调用限制要求 3. **可靠性验证**: - 系统能够处理 API 调用失败和重试 - 详细记录错误信息,便于排查问题 - 支持任务状态查询和管理 ## 视觉锚点 ### Visual Reference - [Authentication.canvas](../../Authentication.canvas) - 项目架构图 ### Status - [x] Draft - [ ] Accepted - [ ] Superceded ## 参考资料 1. [Salesforce Metadata API Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/api_meta_intro.htm) 2. [Salesforce Metadata API - retrieve() 方法详解](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_retrieve.htm) 3. [Salesforce Metadata API - deploy() 方法详解](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_deploy.htm) 4. [DeployOptions 对象参考](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_deploy_deployoptions.htm) 5. [DeployResult 对象参考](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_deploy_deployresult.htm) 6. [Quick Deploy (快速部署) 官方说明](https://help.salesforce.com/s/articleView?id=sf.deploy_quick_deployment.htm&type=5) 7. [Destructive Changes (删除元数据)](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_destructive_changes.htm) 8. [Testing and Code Coverage (单元测试要求)](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_deploy_testing.htm)