datai/docs/archive/decisions/adr/0028-attachment-upload-download.md

252 lines
9.9 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.

# 架构决策记录Attachment 文件上传下载功能
## 背景
REQ-011-2 需求要求实现 Salesforce Attachment 对象的文件上传下载功能。Attachment 是 Salesforce 的传统附件对象(已弃用,但需兼容旧系统),使用 REST API + Base64 编码方式进行文件上传下载,最大支持 50MB 文件。
### 面临的问题
1. **文件上传方式选择**: 需要选择合适的文件上传方式,考虑文件大小限制、编码方式、性能等因素
2. **文件下载方式选择**: 需要选择合适的文件下载方式,考虑内存占用、流式处理、性能等因素
3. **架构设计**: 需要设计合理的架构,支持多种文件对象类型的上传下载功能
4. **依赖管理**: 需要合理管理依赖关系,确保与现有系统的兼容性
### 约束条件
1. **技术栈限制**: 必须基于现有的 Spring Boot 3 技术栈
2. **架构约束**: 必须遵循 Authentication.canvas 中定义的架构和调用关系
3. **模块约束**: 必须在 datai-salesforce-integration 模块下实现
4. **认证约束**: 必须使用 SessionManager 进行会话管理和自动重新登录
5. **API约束**: 必须使用 Salesforce REST API
6. **文件大小约束**: 单个文件大小建议不超过 50MB
7. **内存约束**: 必须使用流式处理避免内存溢出
8. **设计模式约束**: 必须使用策略模式封装上传下载逻辑
## 决策
### 1. 上传方式选择
**决策**: 使用 REST API + Base64 编码方式进行文件上传
**理由**:
- Attachment 对象的官方推荐上传方式是 REST API + Base64 编码
- Base64 编码方式简单易实现,兼容性好
- REST API 是 Salesforce 的标准 API稳定可靠
- 50MB 文件大小限制适合 Base64 编码方式
**实现方案**:
- 使用 HttpClient 发送 POST 请求到 Salesforce REST API
- 使用 Base64 编码文件内容
- 使用 SessionManager 获取 Access Token
- 上传成功返回 Attachment ID
### 2. 下载方式选择
**决策**: 使用 REST API + 流式处理方式进行文件下载
**理由**:
- 流式处理可以有效避免内存溢出
- 适合大文件下载
- 性能良好,用户体验好
- 符合 Salesforce 官方推荐做法
**实现方案**:
- 使用 HttpClient 发送 GET 请求到 Salesforce REST API
- 使用 InputStream 流式处理文件内容
- 使用 FileOutputStream 保存文件到本地
### 3. 架构设计
**决策**: 使用策略模式封装上传下载逻辑
**理由**:
- 策略模式可以很好地支持多种文件对象类型的上传下载功能
- 符合开闭原则,易于扩展新的文件对象类型
- 代码结构清晰,易于维护
- 符合单一职责原则
**实现方案**:
- 定义 FileUploadStrategy 接口,定义 upload() 方法
- 定义 FileDownloadStrategy 接口,定义 download() 方法
- 实现 AttachmentUploadStrategy 类,实现 FileUploadStrategy 接口
- 实现 AttachmentDownloadStrategy 类,实现 FileDownloadStrategy 接口
- 定义 AttachmentFileService 接口,封装上传下载逻辑
- 定义 AttachmentFileServiceImpl 实现类,使用策略模式调用上传下载逻辑
### 4. 依赖管理
**决策**: 依赖 REQ-011-1 的基础设施和 datai-salesforce-integration 模块的 SessionManager、RESTConnection
**理由**:
- REQ-011-1 提供了完整的基础设施,包括枚举、异常、参数、验证等
- SessionManager 提供了会话管理和自动重新登录功能
- RESTConnection 提供了 REST API 调用功能
- 避免重复造轮子,提高代码复用性
**实现方案**:
- 使用 @Autowired 注入 SessionManager
- 使用 @Autowired 注入 RESTConnection
- 使用 REQ-011-1 提供的 FileObjectType、FileErrorCode、FileUploadRequest、FileDownloadRequest、FileUploadResponse、FileDownloadResponse、FileValidationUtils
## 备选方案
### 方案 1: 使用 SOAP API 进行文件上传下载
**优点**:
- SOAP API 功能强大,支持更多操作
- 可以使用 Partner API 进行更灵活的操作
**缺点**:
- SOAP API 复杂度高,实现难度大
- SOAP 协议开销大,性能较差
- 不符合 Attachment 对象的官方推荐方式
**评估**: 不推荐使用
### 方案 2: 使用 Bulk API 进行文件上传下载
**优点**:
- Bulk API 适合批量操作
- 性能较好
**缺点**:
- Bulk API 不适合单个文件上传下载
- 实现复杂度高
- 不符合 Attachment 对象的官方推荐方式
**评估**: 不推荐使用
### 方案 3: 使用 GraphQL API 进行文件上传下载
**优点**:
- GraphQL API 灵活强大
- 可以一次性获取多个数据
**缺点**:
- GraphQL API 对文件上传下载支持有限
- 实现复杂度高
- 不符合 Attachment 对象的官方推荐方式
**评估**: 不推荐使用
## 影响
### 系统架构影响
1. **新增模块**: 在 datai-salesforce-integration 模块下新增 Attachment 上传下载功能
2. **新增接口**: 新增 FileUploadStrategy、FileDownloadStrategy 接口
3. **新增实现**: 新增 AttachmentUploadStrategy、AttachmentDownloadStrategy 实现
4. **新增服务**: 新增 AttachmentFileService 接口和 AttachmentFileServiceImpl 实现
### 开发流程影响
1. **开发流程**: 需要按照 SSOT 方法论进行开发,包括需求定义、方案决策、提示词资产化、执行会话、变更记录、闭环复盘
2. **代码规范**: 需要遵循项目编码规范,使用 Lombok 注解、JSR-303 验证注解等
3. **测试要求**: 需要编写单元测试,确保测试覆盖率 ≥ 90%
### 运维管理影响
1. **监控要求**: 需要监控文件上传下载的性能和错误率
2. **日志要求**: 需要记录详细的日志,便于问题排查
3. **配置要求**: 需要配置文件大小限制、文件类型白名单等
## 风险
### 技术风险
1. **文件大小风险**: 大文件上传下载可能导致内存溢出
- **缓解措施**: 使用流式处理,限制文件大小
2. **API 限流风险**: 频繁的 API 调用可能导致 Salesforce API 限流
- **缓解措施**: 实现重试机制,监控 API 调用频率
3. **认证失效风险**: Access Token 失效可能导致文件上传下载失败
- **缓解措施**: 使用 SessionManager 进行自动重新登录
4. **网络异常风险**: 网络异常可能导致文件上传下载失败
- **缓解措施**: 实现重试机制,提供详细的错误信息
### 业务风险
1. **弃用风险**: Attachment 已被 Salesforce 弃用,未来可能被移除
- **缓解措施**: 提供迁移方案,建议用户使用 ContentDocument
2. **兼容性风险**: 旧系统可能依赖 Attachment 对象
- **缓解措施**: 保持 Attachment 对象的兼容性,提供迁移指南
### 实施风险
1. **开发风险**: 开发过程中可能遇到技术难题
- **缓解措施**: 提前进行技术调研,参考官方文档和示例代码
2. **测试风险**: 测试过程中可能发现性能问题
- **缓解措施**: 提前进行性能测试,优化代码性能
## 回滚策略
### 回滚条件
1. **功能不满足需求**: 如果实现的功能不满足需求,可以进行回滚
2. **性能不达标**: 如果性能不达标,可以进行回滚或优化
3. **严重Bug**: 如果发现严重Bug可以进行回滚或修复
### 回滚步骤
1. **代码回滚**: 使用 Git 回滚代码到上一个稳定版本
2. **数据库回滚**: 如果有数据库变更,需要回滚数据库
3. **配置回滚**: 如果有配置变更,需要回滚配置
4. **通知用户**: 通知用户回滚的原因和影响
### 回滚后调整
1. **问题分析**: 分析回滚的原因,找出问题所在
2. **方案优化**: 优化方案,解决存在的问题
3. **重新实施**: 重新实施优化后的方案
## 验收标准
### 功能验收标准
1. **上传功能**: 能够成功上传本地文件到 Salesforce Attachment 对象
2. **下载功能**: 能够成功从 Salesforce Attachment 对象下载文件到本地
3. **参数验证**: 能够正确验证参数,提供详细的错误信息
4. **异常处理**: 能够正确处理异常,提供详细的错误信息
5. **日志记录**: 能够记录详细的日志,便于问题排查
### 性能验收标准
1. **上传性能**: 文件上传性能良好,不影响系统响应
2. **下载性能**: 文件下载性能良好,不影响系统响应
3. **内存占用**: 内存占用合理,不出现内存溢出
4. **并发性能**: 并发上传下载性能良好,不出现资源竞争
### 代码质量验收标准
1. **代码规范**: 代码符合项目编码规范,有清晰的注释
2. **设计模式**: 使用策略模式封装上传下载逻辑
3. **单一职责**: 遵循单一职责原则和开闭原则
4. **测试覆盖**: 测试覆盖率 ≥ 90%
## 视觉锚点
### Visual Reference
引用 Canvas 的具体节点或快照:
- [Authentication.canvas](../../Authentication.canvas) - 项目架构视觉化展示
- **具体节点**: [集成核心](node_integration_core) - 提供与Salesforce的各种连接方式
- **具体节点**: [SessionManager](node_session_manager_detail) - 会话管理,提供登录服务
- **具体节点**: [RESTConnection](node_rest_connection) - REST API 连接
### Status
- [x] Draft
- [ ] Accepted
- [ ] Superceded
## 参考资料
列出与该决策相关的参考资料,包括文档、文章或其他资源。
- [REQ-011.md](../requirements/REQ-011.md) - Salesforce文件上传下载功能
- [REQ-011-1.md](../requirements/REQ-011-1.md) - 基础设施和枚举定义
- [REQ-011-2.md](../requirements/REQ-011-2.md) - Attachment 文件上传下载功能
- [Attachment文件上传.md](../reference-code/data-dump/Attachment文件上传.md) - Salesforce Attachment 上传实现逻辑
- [Attachment文件下载.md](../reference-code/data-dump/Attachment文件下载.md) - Salesforce Attachment 下载实现逻辑
- [Salesforce REST API 文档](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/) - Salesforce REST API 官方文档
- [Salesforce Attachment 对象文档](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources/sobject_attachment.htm) - Salesforce Attachment 对象官方文档