用华为云 FunctionGraph 做一个 OBS 图片自动压缩服务:Serverless 入门实战
为什么选 Serverless?先说说我的场景
前阵子帮朋友的小站做图床:用户上传的照片动不动就好几 MB,直接原图展示,页面加载慢得让人想关掉。传统做法是搭一台 ECS,装个图片处理服务,再配定时任务……但上传量忽高忽低,服务器大部分时间都在空转,钱花得冤枉。
后来我试了华为云的函数工作流 FunctionGraph。它是一项基于事件驱动的函数托管计算服务:你只写业务函数代码、设置好运行条件,剩下的服务器、扩缩容、运维全交给平台,函数以弹性、免运维、高可靠的方式运行。改完之后的效果很直接:有图片上传时函数才跑,没请求时不产生费用。
FunctionGraph 到底是什么
用官方的说法再白话一点:FunctionGraph 把“一段代码”当作运行单元,事件来了就执行,执行完就释放。几个关键点我自己梳理过,写下来供参考:
- 按量计费:按照请求次数和计量时间付费,毫秒级时长计量粒度;代码未运行时不产生费用,闲置状态 0 成本。函数每月前 100 万次调用免费,小项目基本够用。
- 毫秒级弹性:根据并发请求按需自动增加和减少函数运行实例,流量洪峰也不用提前备机器;独创的 SnapShot 技术让镜像冷启动从分钟级降到秒级。
- 免运维:小时级开发、分钟级部署,不用管服务器补丁和扩容。
- 可视化编排:函数流管理功能支持可视化拖拽式函数编排,还兼容开源 CNCF WorkFlow 标准,多步骤的流程也能串起来。
实战:OBS 上传图片后自动压缩
思路很简单:用户上传原图到 OBS 桶,OBS 的事件通知触发 FunctionGraph 函数,函数读取原图、压缩、生成缩略图,再把结果写回 OBS 的另一个目录。整个链路没有常驻服务器。
第一步:准备两个 OBS 目录
在同一个桶里建两个目录就行,比如 upload/ 放原图,thumb/ 放压缩后的图。目录只是前缀,分开存放是为了避免函数处理自己产出的图片造成循环触发,这个坑我第一次就踩过。
第二步:写一个压缩函数
函数逻辑用 Python 写大概是这个思路:
- 从事件里拿到桶名和对象名,只处理 upload/ 开头的图片;
- 用 OBS SDK 把原图下载到函数的临时目录;
- 调用图片库按比例缩放并适当降低质量,生成一张宽度 800px 左右的缩略图;
- 把缩略图上传到 thumb/ 目录,文件名保持一致,方便前端按规则拼接地址。
函数入口只做这一件事,保持简单:校验输入、处理图片、写回结果,异常时记一条日志就返回,不要让一次坏图拖垮整个流程。
第三步:配置 OBS 触发器
在函数的触发器里选择 OBS 事件,指定桶和 upload/ 前缀。文件一上传,函数自动被唤起。这里要注意触发器的事件类型选“对象创建”,删除事件不需要触发。
第四步:验证
上传一张 3MB 的测试图,几秒后去 thumb/ 目录看结果,体积一般能压到原来的十分之一左右。函数的日志里可以看到每次调用的耗时和内存占用,方便调参。
踩过的两个坑
坑一:循环触发。 一开始我把缩略图也写回了 upload/ 目录,结果函数处理缩略图又触发了自己,调用量瞬间翻倍。解决办法就是前面说的:输出目录和输入目录严格分开,触发器只监听 upload/ 前缀。
坑二:大图超时。 有用户传了十几 MB 的原图,函数默认超时时间不够,处理到一半被中断。解决办法是根据图片大小调大超时时间和内存。内存给得大,CPU 配额也跟着上去,处理速度反而更快。FunctionGraph 按实际运行时间计费,跑得快反而更省钱。
成本和适用场景
按官方的说法,相比传统开发模式,应用上线效率提升 100%,总成本降低 50%。以我的小图床为例,每月几万次调用基本都在免费额度里。FunctionGraph 官方还列了几类典型场景:实时文件处理、实时数据流处理、Web/移动应用后端、人工智能服务集成。比如实时文件处理就是“客户端上传文件到 OBS,触发函数实时创建图像缩略图、转换视频编码、做数据文件汇聚筛选”,和我这个例子是一个路子。
小结
如果你手头也有“事件一来就干点活,平时不用占机器”的需求,FunctionGraph 是个值得一试的起点:不用买服务器,不用写部署脚本,先把一个小函数跑起来,再慢慢把流程串成函数流。Serverless 不是银弹,但对这种波峰波谷明显的轻量任务,它确实把成本和运维都压到了最低。
- 点赞
- 收藏
- 关注作者
评论(0)