2.0 KiB
2.0 KiB
ADR-0006: 多云对象存储抽象
| 状态 | 接受 |
|---|---|
| 创建日期 | 2026-05-25 |
| 作者 | 技术团队 |
上下文
我们需要对象存储服务来处理文件上传、图片存储等需求。考虑到:
- 国内环境下 AWS S3 访问可能不稳定
- 需要灵活切换云服务提供商
- 需要本地开发和测试的支持
决策
我们决定设计一个存储抽象层,支持多个云服务提供商:
- 阿里云 OSS: 国内生产环境首选
- 腾讯云 COS: 备选云服务
- MinIO: 本地开发和私有部署
- AWS S3: 国际部署备选
同时,我们使用适配器模式来统一接口。
备选方案
方案 1: 单一云服务
优点:
- 简单,直接使用 SDK
- 优化特定云服务
缺点:
- 厂商锁定
- 切换成本高
- 本地开发困难
方案 2: 使用 S3 兼容接口
优点:
- 标准接口
- 多云支持
缺点:
- 不是所有云服务完全兼容
- 特殊功能无法使用
后果
正面影响
- 厂商中立: 不绑定特定云服务商
- 灵活切换: 可以轻松切换云服务
- 本地开发: MinIO 提供本地开发支持
- 测试友好: 可以使用 Mock 存储进行测试
- 扩展性: 添加新的云服务只需实现新的适配器
负面影响
- 抽象成本: 需要维护抽象层代码
- 功能限制: 只能使用各云服务的交集功能
- 性能损耗: 抽象层带来轻微性能开销
接口设计
interface StorageAdapter {
upload(file: File, options: UploadOptions): Promise<UploadResult>;
delete(key: string): Promise<void>;
getPresignedUrl(key: string, expiresIn: number): Promise<string>;
}
class AliyunOSSAdapter implements StorageAdapter { /* ... */ }
class TencentCOSAdapter implements StorageAdapter { /* ... */ }
class MinioAdapter implements StorageAdapter { /* ... */ }
class S3Adapter implements StorageAdapter { /* ... */ }