# 架构决策记录 - ContentDocument/ContentVersion 文件上传下载功能 ## 背景 REQ-011-3 需求要求实现 Salesforce ContentDocument/ContentVersion 对象的文件上传下载功能。ContentDocument/ContentVersion 是 Salesforce 的现代文件对象(推荐使用),需要使用 REST API + Multipart/form-data 方式进行文件上传下载,最大支持 2GB 文件,使用流式处理避免内存溢出。 与 Attachment 对象相比,ContentDocument/ContentVersion 具有以下优势: - 支持更大的文件(最大 2GB vs 50MB) - 支持版本控制 - 支持多记录关联(通过 ContentDocumentLink) - 使用 Multipart/form-data 方式,不需要 Base64 编码,减少内存开销 ## 决策 ### 1. 上传方式决策 **决策**: 使用 REST API + Multipart/form-data 方式进行文件上传 **理由**: - Multipart/form-data 方式不需要 Base64 编码,减少内存开销 - 支持流式处理,避免大文件导致内存溢出 - Salesforce 官方推荐使用 Multipart/form-data 方式上传大文件 - 与 Attachment 的 Base64 编码方式相比,性能更好 **实现方案**: - 使用 Apache HttpClient 发送 Multipart/form-data 请求 - 使用 InputStream 流式读取文件内容 - 使用 MultipartEntityBuilder 构建 Multipart/form-data 请求 - 设置 Content-Type 为 multipart/form-data ### 2. HTTP 客户端决策 **决策**: 使用 Apache HttpClient 进行 HTTP 调用 **理由**: - Apache HttpClient 提供完善的 Multipart/form-data 支持 - Apache HttpClient 提供流式处理支持 - Apache HttpClient 是成熟的 HTTP 客户端库,稳定性高 - Apache HttpClient 与 Spring Boot 3 兼容性好 **实现方案**: - 引入 Apache HttpClient 依赖(httpclient 4.5.13、httpmime 4.5.13) - 使用 HttpClient 发送 HTTP 请求 - 使用 MultipartEntityBuilder 构建 Multipart/form-data 请求 - 使用 InputStream 流式处理文件内容 ### 3. 流式处理决策 **决策**: 使用流式处理避免内存溢出 **理由**: - ContentDocument/ContentVersion 支持最大 2GB 文件,不能一次性加载到内存 - 流式处理可以有效控制内存使用 - 流式处理可以提高大文件上传下载的性能 **实现方案**: - 上传时使用 FileInputStream 读取文件内容 - 下载时使用 InputStream 读取响应内容 - 使用 BufferedInputStream 和 BufferedOutputStream 提高性能 - 使用固定大小的缓冲区(如 8KB) ### 4. 架构设计决策 **决策**: 使用策略模式封装上传下载逻辑 **理由**: - 策略模式可以很好地支持多种文件对象类型的上传下载功能 - 符合开闭原则,易于扩展新的文件对象类型 - 代码结构清晰,易于维护 - 符合单一职责原则 **实现方案**: - 复用 FileUploadStrategy 接口,定义 upload() 方法 - 复用 FileDownloadStrategy 接口,定义 download() 方法 - 实现 ContentVersionUploadStrategy 类,实现 FileUploadStrategy 接口 - 实现 ContentVersionDownloadStrategy 类,实现 FileDownloadStrategy 接口 - 定义 ContentVersionFileService 接口,封装上传下载逻辑 - 定义 ContentVersionFileServiceImpl 实现类,使用策略模式调用上传下载逻辑 ## 备选方案 ### 方案 1:使用 REST API + Multipart/form-data + Apache HttpClient(推荐) **优点**: - 不需要 Base64 编码,减少内存开销 - 支持流式处理,避免大文件导致内存溢出 - Salesforce 官方推荐使用 Multipart/form-data 方式上传大文件 - Apache HttpClient 提供完善的 Multipart/form-data 支持 **缺点**: - 需要引入 Apache HttpClient 依赖 - 实现复杂度较高 **评估**: 推荐使用 ### 方案 2:使用 REST API + Base64 编码 **优点**: - 实现简单,不需要额外的依赖 - 与 Attachment 的实现方式一致 **缺点**: - Base64 编码会导致文件大小增加约 33% - 2GB 的文件在编码后约 2.66GB,可能超过 Salesforce 的限制 - 不支持流式处理,大文件可能导致内存溢出 **评估**: 不推荐使用 ### 方案 3:使用 Partner API (SOAP) **优点**: - Salesforce 官方支持 - 提供完善的 API 文档 **缺点**: - SOAP 协议复杂,实现难度高 - 不支持流式处理 - 性能不如 REST API **评估**: 不推荐使用 ## 影响 ### 对系统架构的影响 - **新增依赖**: 需要在 datai-salesforce-integration 模块引入 Apache HttpClient 依赖 - **新增类**: 需要新增 ContentVersionUploadStrategy、ContentVersionDownloadStrategy、ContentVersionFileService、ContentVersionFileServiceImpl 类 - **复用接口**: 复用 FileUploadStrategy 和 FileDownloadStrategy 接口 ### 对开发流程的影响 - **开发复杂度**: 需要实现流式处理逻辑,开发复杂度较高 - **测试复杂度**: 需要测试大文件上传下载功能,测试复杂度较高 ### 对运维管理的影响 - **依赖管理**: 需要管理 Apache HttpClient 依赖的版本 - **性能监控**: 需要监控大文件上传下载的性能 ## 风险 ### 技术风险 - **依赖冲突风险**: Apache HttpClient 依赖可能与其他依赖冲突 - **流式处理风险**: 流式处理实现不当可能导致内存泄漏 - **大文件处理风险**: 2GB 文件上传下载可能导致内存溢出或性能问题 ### 业务风险 - **API 限流风险**: 频繁的 API 调用可能导致 Salesforce API 限流 - **认证失效风险**: Access Token 失效可能导致文件上传下载失败 - **网络异常风险**: 网络异常可能导致文件上传下载失败 ### 实施风险 - **开发周期风险**: 流式处理实现复杂,可能延长开发周期 - **测试周期风险**: 大文件上传下载测试耗时较长,可能延长测试周期 ## 回滚策略 如果决策实施后出现问题,可以采取以下回滚策略: 1. **依赖冲突**: 如果 Apache HttpClient 依赖与其他依赖冲突,可以: - 调整 Apache HttpClient 的版本 - 使用其他 HTTP 客户端库(如 OkHttp) - 使用 Spring 的 RestTemplate(但 RestTemplate 对 Multipart/form-data 支持有限) 2. **流式处理问题**: 如果流式处理实现不当导致内存泄漏,可以: - 优化流式处理逻辑 - 使用更成熟的流式处理库 - 限制文件大小,避免处理超大文件 3. **性能问题**: 如果大文件上传下载性能不佳,可以: - 优化缓冲区大小 - 使用多线程上传下载 - 使用断点续传功能 ## 验收标准 定义验证该决策有效性的具体标准和测试方法: 1. **功能验收标准**: - 能够成功上传本地文件到 Salesforce ContentVersion 对象 - 能够成功从 Salesforce ContentVersion 对象下载文件到本地 - 支持指定组织配置 ID - 支持指定 FirstPublishLocationId(可选) - 支持指定文件名(Title 和 PathOnClient) - 上传成功返回 ContentVersion ID - 下载成功返回文件信息 2. **性能验收标准**: - 大文件上传下载不影响系统响应 - 流式处理有效避免内存溢出 - 2GB 文件上传下载性能良好 3. **代码质量验收标准**: - 代码符合项目编码规范 - 使用策略模式封装上传下载逻辑 - 遵循单一职责原则和开闭原则 - 通过 SonarQube、Checkstyle、SpotBugs 检查 4. **测试验收标准**: - 单元测试覆盖率 ≥ 90% - 集成测试覆盖所有场景 - 性能测试验证大文件上传下载性能 ## 视觉锚点 ### Visual Reference 引用 Canvas 的具体节点或快照: - [Authentication.canvas](../../Authentication.canvas) - 相关架构图 - **具体节点**: [集成核心](node_integration_core) - 提供与Salesforce的各种连接方式 - **具体节点**: [SessionManager](node_session_manager_detail) - 会话管理,提供登录服务 ### Status - [x] Draft - [ ] Accepted - [ ] Superceded ## 参考资料 列出与该决策相关的参考资料,包括文档、文章或其他资源: - [REQ-011.md](../requirements/REQ-011.md) - Salesforce文件上传下载功能 - [REQ-011-3.md](../requirements/REQ-011-3.md) - ContentDocument/ContentVersion 文件上传下载功能 - [ContentVersion上传下载.md](../reference-code/data-dump/ContentVersion上传下载.md) - Salesforce ContentVersion 上传实现逻辑 - [大文件上传下载.md](../reference-code/data-dump/大文件上传下载.md) - 大文件上传下载实现逻辑(Multipart/form-data) - [0028-attachment-upload-download.md](./0028-attachment-upload-download.md) - Attachment 文件上传下载架构决策