解决 LeanCloud '因流控原因,通过定时任务唤醒体验版实例失败' 的问题

本文最后更新于:2021年11月14日 晚上

简述

从我的博客搭建起来我就选用了简洁大方 Valine 作为评论系统,又用 Valine-Admin 做了服务端部署在 LeanCloud 上,两年了基本上运行还是比较稳定的,最近一段时间 LeanCloud 云引擎总是报错:“因流控原因,通过定时任务唤醒体验版实例失败”,了解了下,大概原因就是 LeanCloud 方面做了一些限制,虽然不绝对,但目前极大概率的会遇到这个问题。

LeanCloud 限制的只是容器的定时任务唤醒,而外部访问依然会激活容器!网上的各种解决方案应该都是基于这一点的。

具体说解决办法就是登录云引擎的后台,以 Valine-Admin 来说就是登录评论的后台管理系统,应该说只要手动登陆一下,云函数就能正常运行了,但也不太可能每天去登陆一下后台啊~

所以这里可以借助各种外部工具来定时访问云引擎后台,特别需要注意的是,所有这些解决方案所指的对 LeanCloud 的访问都是访问云引擎域名,不是博客地址!

这里进一步再提醒一下,国内版 LeanCloud 必须绑定域名,且绑定域名需要备案,国外版无需备案。如果不能备案的话只能使用国外版!

LeanCloud 休眠策略

这里需要进一步了解 LeanCloud 的休眠策略,这是诸多问题的关键:

  • 标准实例不会休眠。
  • 体验实例会执行休眠策略:
    • 如果应用最近一段时间(半小时)没有任何外部请求,则休眠。
    • 休眠后如果有新的外部请求实例则马上启动。访问者的体验是第一个请求响应时间是 5 ~ 30 秒(视实例启动时间而定),后续访问响应速度恢复正常。
    • 强制休眠:如果最近 24 小时内累计运行超过 18 小时,则强制休眠。此时新的请求会收到 503 的错误响应码,该错误可在 云引擎 > 统计 中查看。

标准实例显然是最佳方案,但劝退价😂而使用体验示例就要精打细算了,基于上述休眠策略,可以简单算一下,云引擎每天最多能运行18个小时,也就是必须休眠6个小时,显然让它晚上和我们一起睡6个小时更合适一些,当然你也可以选择让它在别的时间睡。

关于 Valine-Admin ,有两个定时任务,一个是每天早晨执行一次的重发漏发邮件的函数,另一个则是每天间隔一段时间执行一次的避免云引擎休眠的唤醒函数,可以看到各种教程都将运行周期设置为 0 */20 7-23 * * ?, 即每天 7:00 到 23:59 期间每 20 分钟执行一次,也就是云引擎至少会在 7:00 到 23:59 持续运行17个小时。

可能你会发现还剩一个小时可以运行,是的,这剩余的一个小时可运行时间留在夜间,即便是有外部请求也能保证云引擎可以被唤醒。甚至保险起见,还可以再多预留一些时间到夜间。

网上的各种方案

遇到这个问题我也是在网上找解决办法,这期间看到了各种方案,大概总结如下:

我使用过 Github Action 和腾讯云函数两种方案,亲测可行,最终保留了腾讯云函数这种方案。

解决问题

1)Github Action - WakeLeanCloud

2)使用腾讯云函数解决 LeanCloud 流控问题(点这里🤣)