起因
在实际开发业务中需要生成带图的表格,由于数据过多导致服务超时。当时我通过在 腾讯云控制台 设置的时间的函数超时600秒,没到时间就超时了。
异常信息如下:
WAServiceMainContext.js:2 Error: cloud.callFunction:fail Error: errCode: -501002 resource server timeout | errMsg: ESOCKETTIMEDOUT
后来通过和官方人员沟通得知小程序基础库的 callFunction 接口的默认限制了云函数超时时间的设置为60秒的上限,无法通过腾讯云控制台修改突破限制。
解决方案
如果不是通过callFunction调用的云函数是可以突破限制的,最多可以设置900秒,所以我用了两个云函数来解决这个超时问题。
云函数A用于小程序调用。
云函数B执行耗时操作,设置超时时间为900秒。
小程序调用云函数A,云函数A不用await修饰符调用云函数B,(云函数内互相调用是稳定的)然后云函数A返回调用成功,小程序这边收到云函数A的返回值就知道任务正在执行了,在小程序A里面去数据库存储一条开始执行状态的数据,返回ID。
然后在云函数B执行耗时操作完成去修改数据库的数据状态。
最后在小程序端监听数据库具体ID数据的状态变化来对用户进行反馈。
总结
当然如果数据量超大的话 900秒也会被用完,优化代码是一方面,但是如果代码优化不了的情况下这个时候就需要与产品功能想一个更好的解决方案。
假如900秒最多导出5000条数据,那么超过5000条就可以让用户分页导出,这样的话又可以保证不超时又能满足用户的方案。
1、可以试试用Promise.all,一次最多可同时处理1000条。
很聪明的解决方案
这个900秒在哪里设置,云开发控制台->配置云函数中最大只能是60秒
代码呢