ByteNoteByteNote

字节笔记本

2026年2月21日

InsForge Storage Architecture - 企业级存储系统架构解析

API中转
¥120

InsForge 是一个现代化的后端即服务(BaaS)平台,提供高性能、可扩展的存储系统。本文详细介绍 InsForge 的存储架构设计,包括基于 AWS S3 的企业级存储方案、核心组件、上传策略、安全配置和最佳实践。

概述

InsForge 的存储系统构建在 AWS S3 之上,提供企业级的可靠性,具有 99.999999999%(11 个 9)的持久性保证。该系统支持多种上传策略、灵活的存储桶配置和强大的安全特性,适用于从小型应用到企业级产品的各种场景。

技术栈

InsForge 存储系统的核心技术栈包括:

  • 存储后端: AWS S3 - 企业级对象存储
  • 元数据存储: PostgreSQL - 文件元数据和存储桶配置
  • 上传处理: Multer - 多部分表单数据解析
  • URL 策略: Presigned URLs - 安全直接上传/下载
  • 访问控制: JWT + 存储桶可见性 - 公共/私有存储桶权限

核心组件

组件技术用途
Storage BackendAWS S3企业级对象存储
Metadata StorePostgreSQL文件元数据、存储桶配置
Upload HandlerMulter多部分表单数据解析
URL StrategyPresigned URLs安全直接上传/下载(仅 S3)
Access ControlJWT + Bucket visibility公共/私有存储桶权限

AWS S3 架构

企业级特性

  • Direct Uploads: Presigned URLs 绕过 API 服务器,实现无限扩展
  • IAM Security: 基于角色的认证,无需管理凭证
  • Multi-Tenancy: 使用应用密钥前缀实现项目间的安全隔离
  • Bucket Policies: 公共和私有存储桶配置
  • Automatic Cleanup: 可配置的生命周期策略
  • Metadata Tracking: 丰富的文件元数据存储在 PostgreSQL 中

上传策略

直接上传到 S3

客户端直接将文件上传到 S3,适用于小规模文件传输。

Presigned URL 上传(推荐)

  1. 客户端请求上传策略
  2. 服务器生成 Presigned URL
  3. 返回 {uploadUrl, key} 给客户端
  4. 客户端直接上传到 S3
  5. 确认上传完成
  6. 存储元数据 {url, key, size}

这种策略绕过 API 服务器,没有服务器内存限制,适合大文件上传。

存储桶配置

存储桶类型

类型访问权限使用场景
Public下载无需认证公共资源、图片、静态文件
Private所有操作需要认证用户文件、敏感文档

文件操作

上传流程

  1. Request Upload: 客户端请求上传权限
  2. Validation: 检查认证、存储桶权限、文件大小
  3. Strategy Selection: 选择直接或 Presigned 上传
  4. Upload: 客户端通过选定方法上传
  5. Confirmation: 验证上传并存储元数据
  6. Response: 返回文件 URL 和元数据

下载流程

  1. Request File: 客户端请求文件访问
  2. Permission Check: 验证存储桶/对象权限
  3. Strategy Selection: 直接提供或 Presigned URL
  4. Delivery: 流式传输文件或重定向到 URL

安全特性

安全功能列表

  • Bucket Policies: 公共、私有或受保护的存储桶访问控制
  • JWT Authentication: 私有资源的基于令牌访问
  • Presigned URLs: 用于安全 S3 访问的限时 URL
  • MIME Type Validation: 限制上传到允许的文件类型
  • Size Limits: 默认 50MB,可通过 MAX_FILE_SIZE 配置
  • App Key Isolation: 使用 S3 中的应用密钥前缀实现多租户隔离

安全 URL 生成

类型使用场景安全性
Public Access静态资源、图片直接 S3 URL
Presigned GET私有文件访问限时、单次使用
Presigned POST直接上传已验证、大小限制

智能元数据管理

InsForge 在 PostgreSQL 中维护优化的元数据,实现即时查询:

  • Fast Search: 索引元数据实现亚毫秒级查找
  • Rich Metadata: MIME 类型、大小、时间戳、自定义标签
  • Usage Analytics: 跟踪下载、带宽、热门文件
  • Access Control: 每文件或存储桶的细粒度权限

性能优化

性能特性

  • Direct S3 Access: 绕过 API 服务器进行上传/下载
  • Browser Caching: Cache-Control 头
  • ETag Support: S3 的条件请求
  • Parallel Uploads: 支持多部分上传

上传方法对比

1. 通过 API 服务器直接上传:

  • 客户端发送文件到 /api/storage/buckets/{bucket}/objects
  • 文件通过 API 服务器内存
  • 服务器上传到 S3
  • 受服务器内存限制(默认 10MB)

2. Presigned URL 上传(推荐):

  • 客户端从 /api/storage/buckets/{bucket}/upload-strategy 请求上传 URL
  • 服务器返回 Presigned POST URL
  • 客户端直接上传到 S3(绕过 API 服务器)
  • 无服务器内存限制
  • 客户端通过 /api/storage/buckets/{bucket}/objects/{key}/confirm-upload 确认上传

配置

环境变量

变量描述示例
AWS_S3_BUCKETS3 存储桶名称my-app-storage
AWS_REGIONAWS 区域us-east-2
APP_KEYS3 多租户的应用密钥my-app-key

S3 配置示例

typescript
// S3 客户端配置
const s3Client = new S3Client({
  region: this.region, // 例如 'us-east-2'
  // IAM 角色凭证在 EC2 上自动使用
  // 生产环境无需显式凭证
});

// 文件路径使用应用密钥前缀实现多租户
const s3Key = `${this.appKey}/${bucket}/${key}`;

最佳实践

  • Use Buckets: 在存储桶中逻辑地组织文件
  • Set Limits: 配置适当的大小/类型限制
  • Clean URLs: 使用一致、SEO 友好的键命名
  • Metadata: 在数据库中存储可搜索的元数据
  • Backup Strategy: 为生产环境实施定期备份
  • Monitor Usage: 跟踪存储成本和使用模式

SDK 参考

InsForge 为多种平台提供存储 SDK:

  • TypeScript: Web 和 Node.js 应用,支持上传、下载和 Presigned URL
  • Swift: iOS、macOS、tvOS 和 watchOS,支持 async/await 文件操作
  • Kotlin: Android 应用,基于 Coroutines 的文件处理
  • Flutter: 跨平台移动应用,统一的文件上传和下载 API
分享: