fischerX/docs/architecture/design-decisions/0006-multi-cloud-storage.md

2.0 KiB

ADR-0006: 多云对象存储抽象

状态 接受
创建日期 2026-05-25
作者 技术团队

上下文

我们需要对象存储服务来处理文件上传、图片存储等需求。考虑到:

  • 国内环境下 AWS S3 访问可能不稳定
  • 需要灵活切换云服务提供商
  • 需要本地开发和测试的支持

决策

我们决定设计一个存储抽象层,支持多个云服务提供商:

  1. 阿里云 OSS: 国内生产环境首选
  2. 腾讯云 COS: 备选云服务
  3. MinIO: 本地开发和私有部署
  4. AWS S3: 国际部署备选

同时,我们使用适配器模式来统一接口。

备选方案

方案 1: 单一云服务

优点:

  • 简单,直接使用 SDK
  • 优化特定云服务

缺点:

  • 厂商锁定
  • 切换成本高
  • 本地开发困难

方案 2: 使用 S3 兼容接口

优点:

  • 标准接口
  • 多云支持

缺点:

  • 不是所有云服务完全兼容
  • 特殊功能无法使用

后果

正面影响

  1. 厂商中立: 不绑定特定云服务商
  2. 灵活切换: 可以轻松切换云服务
  3. 本地开发: MinIO 提供本地开发支持
  4. 测试友好: 可以使用 Mock 存储进行测试
  5. 扩展性: 添加新的云服务只需实现新的适配器

负面影响

  1. 抽象成本: 需要维护抽象层代码
  2. 功能限制: 只能使用各云服务的交集功能
  3. 性能损耗: 抽象层带来轻微性能开销

接口设计

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 { /* ... */ }

相关链接