背景
由于历史原因一直使用又拍云做图片存储和CDN,但是长久存在两个问题:
一是又拍云的服务不够稳定,不时会有服务宕机等令人肉疼的问题。这个问题虽然可以理解,但是不可容忍。于是一直有个念头要有一套备份服务,一旦其中一个故障,马上切换到另一个。
二是由于我们使用的是阿里云服务器,图片的上传方式采用服务器中转。服务器传到又拍云的过程需要耗费公网下行带宽(因为我们使用了负载均衡服务,因此上行是负载均衡的内网带宽,不存在瓶颈)。如果提高服务器带宽配置显得浪费,毕竟只是偶尔有图片在上传,开的低了容易产生瓶颈,所以总是难受。虽然可以采用直传又拍云的方案,但是也有前后端的开发成本和又不是不能用的状态,所以总是没有改过。
转机和实现
在对阿里云OSS进行了比较深入的了解之后逐渐有了一个比较清晰的思路。主要是利用下面两个OSS的功能:
回源机制
阿里云OSS提供回源配制。与CDN的回源类似,如果受访的OSS资源不存在则去源站请求并在OSS存储备份,以便下次访问可以直接获取到。这个配置大大方便了迁移过程,原则上,只要配制好回源地址,可以无缝把服务迁移过来。在又拍云没有挂的时候直接配制所有资源通过阿里云访问,在一段时间之后阿里云OSS就会把热门资源都转存过来。
实际上这么做不是很好,因为回源过程会耗费一定时间,也就是OSS从又拍云下载资源并处理的过程,如果并发高的时候也会带来一定的回源压力,导致可用性降低。不过这类问题都是一时,部分冷门资源如果没有访问机会就不会被转存。因此,可以主动做一次全站资源的扫描预热。
下图就是上线后遇到推送时产生的回源高峰。
上面回源机制解决了如何把又拍云资源同步到阿里云,但是既然是备份服务,应该两套服务的资源是互为镜像关系。又拍云上好像没有找到类似的回源配制,那么如何把阿里云这边新增的资源同步到又拍云呢(我们用了阿里云直传)。于是我们看到了下面的方案。
阿里云函数计算提供的OSS触发器
函数计算支持每当OSS有新资源被上传或更新的时候会产生函数调用,这个函数可以做任何处理,于是我们用函数计算来实现主动同步又拍云。这个过程虽然也是公网流量,一是函数计算支持的带宽比服务器高,二是这个过程没有严格的时间限制,所以这个方案可行。因为我们的上传也同时改到了OSS,这样便可以确保两侧的资源是镜像关系。
存在的问题
阿里云与又拍云虽然都是云存储+CDN,但是毕竟是两个不同的产品,许多地方的功能特性是不同的。有些功能又拍云有的阿里云没有,阿里云有的又拍云没有。总之是有一些波折。下面罗列一些遇到的问题和简单的解决方案。
webp自适应
又拍云深得我心的其中一个功能就是webp自适应,如果请求图片的Accept头含有image/webp则自动返回webp格式,否则返回原格式。这样不仅节省用户流量,提升加载速度,也省下了开发成本和流量成本,可以说是非常优秀的功能。
但是阿里云就没有这种功能,因此只能用不同的图片地址来返回webp,这层判断只能在接口层。目前我们暂时统一返回原格式,先放弃webp,不过我也想到一个奇技淫巧的解决方案:做一个接口接收资源的路径,然后在这个接口判断Accept并返回webp或原格式的302跳转。这样会多一倍HTTP请求,不过会换来80%以上的流量节省。效果有待验证,不过我没有见过别人这么干。而且另一个问题是这个接口可能会产生比较高的并发QPS,虽然没有什么计算量,但是可用性必须要高过阿里云OSS才不会变成瓶颈。
图片处理功能的不同
- 图片水印,又拍云支持平铺模式,平铺就是铺地砖的效果,但是阿里云没有这个功能,只能指定一个位置。因此需要自己做图片处理,同样可以用上面提到的函数计算来实现,一是会麻烦点,二是需要在OSS存一张平铺水印图,增加了存储空间占用。还有一些其他配置也不尽相同所以设置的时候要注意。
- 动图处理,又拍云处理GIF动图,只要不是转为静态格式,其他操作都是支持的,但是阿里云这里动图加水印会变静态jpg,其他一些操作也有可能变静态,比如选择了方向自适应也会莫名的变静态,原因可能是jpg才有方向属性,所以还是很奇怪。不提工单问就没法领会到这种机制。
- 图片处理的其他参数,阿里云GUI界面的图片处理规则比又拍云有更复杂的参数,比如图片质量,又拍云就一个数字,阿里云会要你选择“相对质量”或“绝对质量”,再比如锐化,又拍云只有一个checkbox,但是阿里云有50~399的参数给你选。这意味着你需要了解更多的技术细节。
后记
关于直传
直传到流程是由服务端下发临时访问授权,由客户端直传到云存储,再由客户端提交URL给服务端做资源的入库。这样最大的好处是节省了服务器的上下行带宽,避免了一些瓶颈。弊端是增加了前后端的开发工作,而且授权过程相对暴露,再者因为把逻辑做在了客户端,实际上也不太利于服务的切换。
在使用又拍云的时候有计划用直传方式来改善上传体验,因此这个任务就在这次服务迁移的时候也被提上了日程,不过改成了直传阿里云OSS。后来想到如果继续使用服务器中转的方式其实也是OK的,因为如果是阿里云服务器转存到阿里云OSS其实也是内网啊!
图片处理的另一种可能
在serverless大热的今天,阿里云在函数计算的投入也是有目共睹。最近阿里云CDN支持了函数计算的回源方式,所以部分图片处理算法可以由函数计算来实现并利用CDN缓存处理结果。详情请查阅下一篇文章《函数计算实现水印平铺》。
注册阿里云
还没有注册阿里云的朋友可以点击这里,有最高¥2000元代金券可得:https://www.aliyun.com/minisite/goods?userCode=d1o5zdn4