惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
G
Google Developers Blog
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
爱范儿
爱范儿
B
Blog
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
博客园_首页
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence

Aimee's Blog

秒杀怎么防机器人:验证码之外的几道防线 防薅羊毛怎么做:号码风控、设备指纹与分层策略 接口限流怎么选:固定窗口、滑动窗口、令牌桶 批量打包下载怎么设计:流式 ZIP 与异步任务 大文件上传怎么设计:分片、断点续传、秒传 报表可重跑的设计:快照、水位线与幂等 UV 统计为什么有误差:精确计数与近似计数怎么选 大数据量导出怎么做:流式写入与异步任务 排行榜的两类需求,难度差了一个数量级 内容审核怎么选:先审后发,还是先发后审 实时热榜怎么设计:Redis ZSet 与热度分值 互关状态怎么保持同步:双向关系的维护与缓存失效 并发点赞的计数设计:原子操作与最终对账 删了父评论,子评论怎么处理——先想清楚用户看到的是什么 定时消息任务触发了两次 消息量大,写扩散还是读扩散——接到这个需求先问清楚规模 同一条消息推送了三次 活动结束了,用户还在收短信 接到注销需求,先问两个问题 微服务与服务拆分:何时拆、怎么拆 异步与事件驱动架构:把协作从「打电话」改成「发消息」 高可用设计:怎么让系统尽量不宕机 可扩展性设计:怎么让系统加机器就能扛更多 缓存架构:多级缓存怎么搭 高并发三板斧:限流、熔断、降级 架构设计到底在设计什么 —— 从单体到微服务的演进 服务成本账:一个服务一个月烧多少钱 可观测性:线上出问题怎么查 API 设计:好接口长什么样 消息队列:为什么要 MQ,以及丢失、重复、顺序怎么破
图片处理怎么做:异步处理与 CDN 实时参数
Aimee · 2026-08-15 · via Aimee's Blog

图片处理怎么做:异步处理与 CDN 实时参数

「用户上传的原图太大,页面加载慢,压缩一下」——这个需求最直觉的做法是在上传接口里同步压缩。

但图片压缩是 CPU 密集型操作,量一上来,接口响应时间飙升、线程池被占满,其他接口跟着超时。它不能放在同步接口的请求链路里。


正确的处理时机:上传后异步处理

用户上传原图
    ↓
存储原图到 OSS(直传,不处理,快)
    ↓ 发消息
MQ Consumer 异步处理
    ├── 压缩(降质量)
    ├── 转格式(JPEG → WebP,体积减少 30-50%)
    └── 生成多尺寸(thumbnail 200px / medium 800px / original)
    ↓
把处理后的版本存回 OSS
    ↓
更新数据库:各尺寸的 URL

上传接口只做"收原图、存 OSS、发消息"三件事,响应速度极快。图片处理在后台异步跑,耗时不影响用户。


多尺寸版本的 URL 管理

不要在业务代码里硬拼 URL 后缀:

// 不好的做法:URL 规则散落在各处
String thumbnailUrl = originalUrl.replace(".jpg", "_thumb.jpg");

应该在数据库里单独存每个版本的 URL:

CREATE TABLE image (
    id           BIGINT PRIMARY KEY,
    original_url VARCHAR(512),
    thumbnail_url VARCHAR(512),   -- 200px
    medium_url   VARCHAR(512),    -- 800px
    created_at   DATETIME
);

业务代码按需取对应尺寸,不依赖 URL 命名规则。


CDN + 参数化处理:省掉预生成这一步

主流云存储(阿里云 OSS、腾讯云 COS、七牛云)支持图片处理参数,通过在 URL 上加参数实时处理:

# 原图 URL
https://cdn.example.com/user/avatar/abc.jpg

# 缩放到宽 200px,自动高度
https://cdn.example.com/user/avatar/abc.jpg?x-oss-process=image/resize,w_200

# 转 WebP 格式,质量 80
https://cdn.example.com/user/avatar/abc.jpg?x-oss-process=image/format,webp/quality,q_80

# 先缩放,再转 WebP(组合处理)
https://cdn.example.com/user/avatar/abc.jpg?x-oss-process=image/resize,w_800/format,webp

第一次请求时 OSS 实时处理,处理结果 CDN 缓存——后续相同参数的请求直接走 CDN,不再处理。

这样连预生成多尺寸都省了,前端需要什么尺寸就拼什么参数,灵活性更高。


不要在 API 服务里做图片处理

无论是压缩还是格式转换,ImageIO、PIL、sharp 这些库都会:

  • 占用大量 CPU
  • 在内存里展开整张图(8MB 的 JPEG 解码后可能是 100MB+ 的 bitmap)
  • 处理时间不可控

API 服务器的线程是宝贵资源,要处理更多的并发请求,不是用来跑图片处理的。

图片处理要么交给 OSS/CDN(参数化实时处理),要么放到专门的 Worker 服务里异步跑,和主业务 API 隔离开。