技术方案全景
做完缩略图方案后,我在白板上画了一张图——一张图片从上传到用户看到,到底要经历哪些环节?
六个环节,每一个都有技术挑战。我需要为每个环节选择合适的技术方案。
上传方案
方案 A:直传服务器(当前方案)
客户端 → 我的服务器 → 对象存储
方案 B:客户端直传对象存储
客户端 → 对象存储(服务器只签发上传凭证)
方案 C:分片上传 + 断点续传
客户端 → 分片 → 对象存储(适合大文件)
审核方案
方案 A:自研审核模型
自己训练 NSFW 检测模型,部署推理服务
方案 B:云服务 API
调用阿里云/腾讯云的内容安全 API
方案 C:开源模型
使用 NSFW.js / open_nsfw 等开源方案
处理方案
方案 A:上传时处理(同步)
用户上传后立即生成所有尺寸
方案 B:上传后异步处理
上传后丢到消息队列,异步处理
方案 C:CDN 边缘处理
不预生成,用户请求时在 CDN 边缘节点按需裁剪
存储方案
方案 A:服务器本地磁盘(当前方案)
简单但不可靠,无法扩展
方案 B:对象存储(S3/OSS/COS)
可靠、可扩展、按量付费
方案 C:对象存储 + 分层
热数据标准存储,冷数据低频/归档存储
分发方案
方案 A:源站直出(当前方案)
所有用户直接访问源站
方案 B:全站 CDN
所有图片通过 CDN 分发
方案 C:CDN + 源站回源
CDN 缓存未命中时回源站拉取
基于当前的业务规模(用户数千人,日新增图片几百张),我做了第一版技术选型:
| 环节 | 选择 | 理由 |
|---|---|---|
| 上传 | 客户端直传 OSS | 减轻服务器压力,支持大文件 |
| 审核 | 云服务 API | 快速上线,准确率高 |
| 处理 | 异步处理 + CDN 边缘处理 | 平衡实时性和成本 |
| 存储 | 阿里云 OSS + 分层 | 可靠,可扩展 |
| 分发 | CDN + 回源 | 就近访问,降低延迟 |
整体架构:
这个架构看起来很美好。但我知道,真正的挑战在于每个环节的细节实现。
接下来,我要从最基础的开始——理解图片本身。
思考 1
为什么我选择”客户端直传 OSS”而不是”服务器中转”?两种方案各有什么优缺点?
解题思路:
两个方案要放在同一组维度上比较:带宽占用、扩展能力、预处理能力、权限控制与成本。图片场景的关键特征是「文件大」,所以带宽与扩展能力是主导因素,而预处理能力在这里恰恰不重要。
详细步骤:
服务器中转方案:
客户端 → 我的服务器 → OSS
优点:
- 服务器可以对文件做预处理(校验、压缩)
- 可以控制上传权限,更安全
- 上传逻辑集中管理
缺点:
- 服务器带宽是瓶颈(8.7MB 的图片 × 并发上传 = 带宽爆炸)
- 服务器磁盘 I/O 压力大
- 单点故障——服务器挂了就全挂了
- 服务器成本高(需要更大的带宽和磁盘)客户端直传方案:
客户端 → OSS(服务器只签发上传凭证)
优点:
- 上传流量不经过服务器,节省带宽
- OSS 的上传能力远强于单台服务器(支持分片、断点续传)
- 服务器只做轻量操作(签发凭证),不容易成为瓶颈
缺点:
- 需要设计安全的凭证机制,防止滥用
- 客户端需要集成 OSS SDK
- 服务器无法在上传时预处理典型实现:
对于图片场景,客户端直传几乎总是更好的选择。 图片文件大,走服务器中转纯属浪费带宽。
最终答案:
选客户端直传 OSS。图片体积大,走服务器中转会让服务器带宽和磁盘 I/O 成为瓶颈,还带来单点故障与更高成本;代价是要设计好凭证签发与防滥用机制。对于图片场景,客户端直传几乎总是更好的选择。
思考 2
架构图中,审核和处理是并行还是串行?如果审核发现图片违规,已经处理好的缩略图怎么办?
解题思路:
题目问的是「先处理还是先审核」的顺序。判断依据有两个:违规图片的处理算力要不要白白浪费,以及违规内容会不会在审核完成前被 CDN 缓存出去;审核自身的耗时也要一起算进账。
详细步骤:
我的方案:先审后处理
上传 → 审核 → (通过) → 异步处理 → 存储 → CDN
→ (拒绝) → 删除原图 → 通知用户原因:
-
避免资源浪费:如果先处理再审核,违规图片的处理算力白花了。处理 5 种缩略图需要 1~2 秒,如果最终是违规图片,这些算力就浪费了。
-
避免”违规内容短暂可访问”的问题:如果先处理再审核,在审核完成前,违规图片的缩略图可能已经被 CDN 缓存了。
-
审核本身很快:云 API 的审核通常在 200ms~1s 内返回结果,不会成为上传流程的瓶颈。
审核通过后的处理流程:
极端情况:如果审核漏放了一张违规图片怎么办?
- CDN 层面:支持紧急刷新(purge),可以快速从 CDN 节点删除
- OSS 层面:直接删除源文件,CDN 缓存过期后自动不可访问
- 数据库层面:标记为违规,前端不再展示
最终答案:
串行,且先审后处理:上传 → 审核 →(通过)异步处理 → 存储 → CDN;(拒绝)则删除原图并通知用户。这样既避免违规图片的处理算力白费,也避免违规缩略图短暂可访问;审核只需 200ms~1s,不会成为瓶颈。极端漏放时有 CDN purge、删除源文件、数据库标记三道兜底。
发现内容有问题?
告诉我们哪里需要改进。
