我有一个API js文件,由cronjob通过curl GET调用。
这个js文件基本上通过await fetch
对外部API进行查询,并通过await .. updateOne
从响应中保存一些数据到MongoDB。问题是这在循环中发生大约500个不同的值,并且需要超过10秒才能完成,而我的服务器对无服务器函数的超时限制是10秒。
如何将它分割成多个"GET"请求吗?是不是在API js文件内做一个for loop
是一样的,因为它仍然算作一个单一的操作?
每次我通过不同的关键词谷歌这个,它发现我不相关的东西,我错过了什么?也许这样的案例很少见吧?我对整个cronjob/无服务器功能的事情是新的,如果这不是正确的地方,请指出我应该在Stack Exchange的哪里发布它。
两种可能的解决方案:
-
蛮力方法将是增加超时设置,您可以通过(与Vercel无关,企业版超时时间为900秒,专业版超时时间为60秒,免费版超时时间为10秒)serverless.yml
,在provider
部分或在函数定义中直接做到这一点。(AWS Lambdas的最大超时时间为900秒或15分钟) - 在Lambda函数中执行for循环不会改变太多。如果您可以将其分解为多个cron作业,您可以将其参数化。例如,想象一个cron作业,它每天都要通过一个员工列表来做一些处理。可以将cron作业更改为接受一系列字母,这些字母按姓氏过滤员工列表。因此,您可以做四个cron工作,而不是一个cron工作:A-F,G-M,N-S和T-Z。(在你的情况下,试图找到一个参数,将500个值分成大小相等的桶。)
当你在无服务器(至少在AWS)中按持续时间和内存消耗计费时,将其分开可能没有太大意义,所以增加超时设置可能是更容易的解决方案,但我不知道你的完整上下文,所以这只是一个猜测。