跳转到内容
HexaTransfer
返回博客
技术深度解析

文件传输的S3兼容存储架构

基于S3兼容存储构建文件传输系统。架构模式、服务商对比和性能优化技巧。

国家网信办(CAC)发布的数据出境安全评估规定要求企业清楚掌握数据在哪里存储、如何传输。S3兼容存储是多数现代文件传输服务的骨干基础设施,因为其API已成通用标准,定价具有竞争力,且无需管理物理磁盘即可线性扩展。AWS S3首创了这一模型,Cloudflare R2、Backblaze B2、Wasabi、MinIO和DigitalOcean Spaces均实现了相同的REST接口。基于S3兼容存储构建传输服务,可获得持久对象存储(AWS宣称11个9的持久性)、大文件多部分上传,以及浏览器直传存储的预签名URL——完全绕过应用服务器。

S3 API成为行业标准的原因

S3 API实际上已是事实标准。亚马逊于2006年发布该API,所有主要对象存储服务商均实现了它以承接工作负载。这意味着一个使用AWS SDK for JavaScript(aws-sdk v3)编写的传输服务,只需更改端点URL即可在各服务商之间切换。minio-js、MinIO的mc CLI和rclone等开源客户端在各服务商之间无需修改即可使用。这为架构师提供了极大的灵活性:以AWS S3为起点确保可靠性,迁移到Cloudflare R2享受零出站费用,或以MinIO自托管满足数据驻留要求——无需重写应用代码。

传输场景的服务商对比

| 服务商 | 存储费用 | 出站费用 | 免费额度 | 特点 | |---|---|---|---|---| | AWS S3 Standard | 0.023美元/GB | 0.09美元/GB | 5 GB存储,15 GB出站/月 | 11个9持久性 | | Cloudflare R2 | 0.015美元/GB | 0美元 | 10 GB,100万次读取/月 | 零出站费用 | | Backblaze B2 | 0.006美元/GB | 0.01美元/GB | 10 GB免费 | 与Cloudflare带宽联盟合作 | | Wasabi | 0.0069美元/GB | 0美元 | 无(仅付费) | 最低90天存储期 | | MinIO自托管 | 硬件成本 | 自有带宽 | 开源 | AGPL v3,可在任意环境运行 | | DigitalOcean Spaces | 5美元/月含250 GB | 含1 TB | 无 | 固定价格套餐 |

对于文件短暂存储后即被下载的传输服务,出站费用占主导地位。Cloudflare R2和Backblaze B2(通过带宽联盟)在成本上占优。AWS S3在Intelligent-Tiering和生命周期策略等功能上领先。

大文件的多部分上传

S3多部分上传API是传输服务处理5 GB以上文件的核心机制。流程为:发起InitiateMultipartUpload获取UploadId,对每个分块执行UploadPart(最小5 MB,最大5 GB,总计最多10,000个分块),最后发送带ETag列表的CompleteMultipartUpload。各分块可并行上传,失败的分块独立重试。客户端使用每个分块的预签名URL,使上传直接从浏览器到S3,完全绕过应用服务器。S3的最大对象大小为5 TB,涵盖了几乎所有文件传输场景。

预签名URL与直接上传

预签名URL允许客户端直接上传或下载到S3,无需应用服务器接触字节数据。后端使用HMAC-SHA256和AWS凭证生成一个有效期(通常1到24小时)的签名URL,客户端对该URL执行PUT或GET操作。这种模式能节省可观的成本:应用服务器无需承担代理10 GB文件的带宽,而且延迟更低,因为客户端直接访问存储端点。存储桶的CORS配置允许来自服务域的浏览器上传。可使用SSE-C(服务器端加密,客户提供密钥)或SSE-KMS进行静态加密。

传输服务的架构模式

典型的S3支撑传输架构分三层:前端在浏览器中运行,发起多部分上传并追踪分块进度;API后端(小型Node.js、Go或Python服务)处理认证、在PostgreSQL或DynamoDB中存储元数据以及生成预签名URL;存储层是S3兼容的存储桶。这一架构可水平扩展,因为应用层是无状态的,存储层承载所有带宽。在GET请求前加入Cloudflare或CloudFront CDN可提升全球下载速度,并减少来自S3的出站流量。

生命周期策略与自动删除

传输服务需要文件自动过期。S3生命周期规则根据对象年龄在存储类别之间转换或直接删除。"删除7天以上的对象"规则每日运行,自动清理过期传输文件,无需额外成本。Cloudflare R2通过Terraform提供商或R2 API支持生命周期规则。更精细的控制方式是给每个对象打上过期时间戳标签,并运行夜间Lambda基于标签删除文件。废弃的多部分上传应有独立规则——AbortIncompleteMultipartUpload设置1到7天,回收未完成会话占用的存储空间。

性能优化

S3吞吐量随前缀扩展。AWS S3对存储桶中每个前缀的PUT请求目标为每秒3,500次,GET请求为每秒5,500次,并使用键名前几个字符的一致性哈希进行负载分区。避免使用顺序键前缀(001、002、003),因为它们哈希到同一分区并产生热点;改用随机前缀或UUID前8位等基于哈希的键。多部分上传可提升单次传输的吞吐量;跨键的并行连接可提升总体吞吐量。Transfer Acceleration通过最近的CloudFront边缘路由上传,对于远距离客户端可在额外费用的情况下将上传时间缩短50%到500%。

加密选项及其权衡

服务端加密有三种形式:SSE-S3(或R2的默认加密)使用由服务提供商管理密钥的AES-256,透明且免费;SSE-KMS使用AWS KMS托管的密钥,每10,000次请求收费0.03美元加上密钥费用,并产生有助于合规的KMS审计日志;SSE-C接受每次请求提供的客户密钥,服务器加密后丢弃该密钥,因此客户必须在每次读取时提供密钥——操作繁琐,但密钥不进入服务提供商的控制范围。对于真正的E2EE,在上传前使用libsodium或Web Crypto的AES-GCM进行客户端加密,然后将存储对象作为不透明密文处理。

HexaTransfer的集成方案

一个最简化的传输流程:客户端请求上传令牌,后端生成多部分上传初始化的预签名URL,客户端直接上传分块到S3,后端存储元数据并返回可分享链接,接收方点击链接,后端生成预签名下载URL,浏览器获取并解密。HexaTransfer使用这一模式配合客户端AES-256-GCM加密,因此S3兼容后端只存储密文,加密密钥从不离开浏览器。

访问 https://hexatransfer.com — 免费,无需注册,最大10 GB。

通过端到端加密安全发送大文件

通过端到端加密免费传输最大10GB的文件。无需注册账户。文件在上传前在浏览器中加密,其他人无法读取。

发送文件