成本优化:新一代图片编码AVIF在手Q应用实践
1. 背景
面临的问题
图片瀑布流是我们 手Q个性化业务 最主要的表现形式,很多页面的图片资源都十分庞大。虽然 之前 已经做了一些优化,将除首屏模块外的所有图片进行懒加载,但是页面所需加载的资源仍然不小。
由此带来的是巨大的流量成本,仅tianquan.gtimg.cn一个域名,峰值流量就超过50G,每年需要上百万的流量带宽费用。因此 我们考虑 将业务使用的图片改为比较新的压缩格式 ,在不影响用户使用体验的前提下,理论上可以极大的节约业务流量成本。
主流的压缩格式
2. 压缩格式如何选择
兼容性
根据 caniuse [2] 的数据,除Safari外,Chrome、Firefox、Opera等主流浏览器均已实现对AVIF的支持。
图片质量
压缩效率
和上面类似,我们取自身业务的图片进行图片压缩效率测试,结果如下:
压缩耗时
对于大尺寸的图片,很多压缩算法可能存在图片转换耗时较高的情况。但在我们的业务场景中,大部分用户走的是cdn缓存,并不需要重新转换和压缩。因此当业务访问量巨大时,图片压缩耗时几乎可以忽略。小结
3. 功能如何落地?
WebView场景的功能落地基本分为三步:
1. 确认作为源站的COS桶,是否开启数据万象的图片压缩功能。
2. 图片的cdn后缀加上COS图片压缩参数,如
https://tianquan.gtimg.cn/card/item/2009152/newPreview2.jpg安卓可以变为:
https://tianquan.gtimg.cn/card/item/2009152/newPreview2.jpg?imageMogr2/format/avifiOS可以变为:
https://tianquan.gtimg.cn/card/item/2009152/newPreview2.jpg?imageMogr2/format/webp3. 配置cdn回源规则,根据accept请求头来判断该图片请求环境是否支持该压缩格式。
具体逻辑如下:
如果请求后缀带有imageMogr2/format/avif,则判断accept中是否包含image/avif字段,如果没带,则直接去掉imageMogr2/format/avif后缀。webp也类似。参考cdn回源规则配置如下:
$uri ~ \?imageMogr2/format/avif{$accept !~ image/avif{fwd_uri $urlcache_key $host$uri_noavif}}$uri ~ \?imageMogr2/format/webp{$accept !~ image/webp{fwd_uri $urlcache_key $host$uri_nowebp}}
以上方式的好处是可以使用代码按页面和图片种 类来控制压缩格式灰度范围,控制风险。
当然也可以直接在cdn配置回源规则: 如果带了相应的accept头,就在回源时添加压缩参数后缀。 这样业务侧不需要改动即可实现图片压缩功能。 注意: 修改完规则后务必先配host进行验证!4. 数据统计和效果分析
虽然前面对新编码格式做了一些简单的测试。但是在会员个性化商城中,各个子商城页面上图片特征的差异是比较大的。为了证明AVIF编码对不同图片特征的压缩效果都是正向的,我们需要收集外网用户的实际资源加载大小和速度。在现代浏览器中已经内置了 PerformanceResourceTiming API [5] ,配置响应头 Timing-Allow-Origin [6] 后,可以非常灵活地统计出资源的加载情况。
我们对不同页面图片的图片平均加载时间和图片平均体积进行统计(具体代码点这里),并将结果上报到第三方平台TAM的自定义测速:
图片平均加载时间由3755ms左右下降到了 2034ms ,图片平均体积由458KB下降到了 95KB 。
结论:经过对各个页面的数据分析,发现对高清晰度、大体积的图片压缩效果较好,对小体积图片压缩效果较差。值得一提的是,群昵称的图片由于业务原因,图片的颜色细节不需要非常丰富,因此选择了PNG-8的形式进行存储。PNG-8相比常规的PNG-24尺寸非常小,再使用AVIF效果并不明显,反而可能因为存储方式变化导致图片体积变大了。 关于PNG-8的一些简单介绍见 PNG-8、24、32区别介绍 [7] 。
5. 最终效果
周日峰值流量由23G左右下降到了14G左右,下降幅度将近 40% 。
根据我们的测算,峰值下降了40%每个月可以节省数万元CDN带宽成本,同时页面的打开速度也因为这项优化提升了约15%,是一种简单高效的降本增效利器!
https://caniuse.com/avif
[3]https://avif.i o/blog/tutorials/ios /#iosavifsupport
[4]图片压缩概述: https://cloud.tencent.com/document/product/436/49259
[5] https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceResourceTiming [6] https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Timing-Allow-Origin [7] PNG-8、24、32区别介绍:https://www.jianshu.com/p/31207790bad2