完整系统

到这一章,图片 CDN 系统已经不再是“上传一张图并返回一个 URL”的简单功能,而是一套覆盖上传、存储、处理、审核、分发、观测和成本治理的内容基础设施。完整架构的重点,是让每个模块各司其职,同时通过清晰状态和事件流串成一个可靠闭环。

最简实现:Flask + 本地磁盘,无 CDN,无压缩
用户层
用户浏览器 直接访问服务器
应用层
Flask 服务器 1 核 2G,5Mbps 带宽
存储层
本地磁盘 100GB,无冗余
客户端直传 OSS + 缩略图生成 + WebP 转换
用户层
用户浏览器 直传 OSS
应用层
上传服务 签发 STS 凭证
处理服务 缩略图 + WebP
存储层
阿里云 OSS 原图 + 缩略图
PostgreSQL 元数据
CDN 全球加速 + 内容审核 + 异步处理队列
用户层
用户浏览器 就近访问 CDN
CDN 层
阿里云 CDN 2800+ 节点,边缘裁剪
应用层
上传服务 ×3 签发凭证 + 回调
审核服务 ×2 鉴黄 + OCR
处理服务 ×4 多尺寸 + WebP/AVIF
数据层
阿里云 OSS 标准 + 低频 + 归档
RabbitMQ 异步处理队列
PostgreSQL 元数据 + 用户
生产级图片系统:12,000 用户,85,000 张图片,月成本 ¥1,720
用户层
用户浏览器 <picture> + 懒加载
CDN 层
阿里云 CDN 缓存命中率 96%,边缘裁剪
服务层
上传服务 ×3 STS 凭证 + 频率限制
审核服务 ×2 鉴黄 + OCR + 人审
处理服务 ×4 多尺寸 + EXIF
数据层
阿里云 OSS 标准 + 低频 + 归档
RabbitMQ upload→audit→process
辅助系统
Prometheus CDN 命中率 / 延迟
Grafana 监控面板 + 告警

最终链路可以这样理解:客户端先向业务服务申请上传凭证,再直传对象存储;上传完成后写入图片元数据,并发布处理事件;压缩服务生成多格式、多尺寸派生图;审核服务决定图片是否允许展示;CDN 根据稳定缓存键分发已通过审核的版本;生命周期任务根据访问热度和业务状态迁移或清理对象。每一步都要能重试、追踪和降级。

系统中的关键取舍包括:原图是否永久保留,派生图是预生成还是按需生成,审核前是否允许预览,CDN 缓存如何与权限控制共存,冷热分层是否影响恢复速度,成本优化是否会牺牲长尾体验。这些问题没有统一答案,但课程会要求你把业务约束、用户体验、成本和故障恢复放在同一张架构图里权衡。

完成本章后,你应当能画出生产级图片平台的核心架构,并说明每个组件解决什么问题、依赖什么数据、失败后如何恢复。更重要的是,你会具备判断能力:当业务从头像扩展到商品图、社区图片、营销素材或多地区分发时,哪些设计可以复用,哪些地方必须重新评估。

章节