云开发计费调整后,对存储和CDN用量较大的业务成本影响较大。把文件从云存储迁移到对象存储(下文简称 COS ),是一个成本优化的选择。
我自己的小程序比较下来,每月的费用大约是不迁的三分之一(刚好也赶上双11的活动攒了一波优惠资源);如果不考虑活动,正常买资源包,大约也能降低一半。
但相比从零开始就是「云函数 + 云数据库 + COS」的架构,就急需一个高效稳定的迁移方案,迁移云存储中的文件,并同时更新数据库记录。最好还无需停服。
这里就不赘述那些尝试过的失败方案,仅记录并分享最后跑通的流程,供有类似需求的开发者朋友参考。
一、开通并设置COS、CDN
- 在腾讯云创建COS的存储桶(最好和云存储同地域,之后迁移既快又经济),「权限管理」设置为“私有读写”,避免外网的直接下行访问;
- 注册或找个域名,设置为 COS 的「自定义CDN加速域名」,开启「回源鉴权」;
- 进入「内容分发网络」的「域名管理」,在「管理」的「访问控制」,开启「防盗链配置」——类型选「白名单」,填入小程序域名“servicewechat.com”。这里需要开启「允许空 referer 访问」,如不开启,手机端将无法访问 video 组件的视频文件(这个问题至今尚未修复)。
二、准备小程序的更新版,提交审核(增删改查指向COS新路径)
- 在腾讯云控制台「访问管理」中创建一个子用户角色,获取 secretId 和 secretKey;
- 写一个云函数,通过 secretId 和 secretKey 生成临时密钥;
- 客户端上传文件时,先触发这个云函数获取COS的临时密钥,用于客户端 wx.uploadFile 文件上传;
- 上传完成后,回调函数里获取 COS 文件路径,写入云数据库;
- 以上是“增”,“删改查”同理,不赘述(访问 COS 的云函数,需要通过 npm 给云函数装 COS 的 Node.js SDK)。
详细实践可参考腾讯云文档:小程序直传实践。
新版本准备好了便提交小程序审核。
三、写迁移云函数
- 因云函数默认内存256M、超时时间3s,最大也只可设置为 1024M、60s,如不够用,可将迁移过程拆为任务发起函数和执行函数;
- 发起函数获取需要迁移的文件数据(如数据量大,可根据数据结构再拆分云函数读取),异步调用执行函数,不等执行结果;每个执行函数只执行一个文件的迁移、及更新数据记录的任务。这样执行时云函数都不会超过内存和时间限制;
- 执行函数里,先 cos.downloadFile 云存储的文件到云函数的缓存(注意路径是“/tmp/文件名”,不是“__dirname/文件名”),再从缓存 cos.uploadFile 到 COS。
四、发布小程序、执行迁移
小程序审核通过、迁移云函数都准备好后:
- 小程序新版发布上线;
- 通过IDE编译,触发迁移云函数里的发起函数。迁移全程同地域内网执行(不要用本地调试。公网执行慢很多,容易超时,且会产生公网流量费);
- 因为执行函数并发量大,容易受到云函数并发数的500/分钟的限制,500以上的都会执行失败(500是入门版到团队进阶版的每分钟并发数,个人版100,更贵的版本更高)。因此执行函数里只能执行一个文件迁移就立即更新相应记录,不能汇总了再更新;
- 如数据量很大、发起函数拆分后读取仍超时,可在数据库记录任务发起情况,多触发几次,总会迁移完。
在这个尝试迁移的过程中,有幸得到腾讯云工单同学、客户经理、云开发产品经理的支持和点拨,多次在挠头时刻解惑。感谢。
才疏学浅,如有谬误,请多多指正~