使用云函数解决leancloud流控问题
2021-03-24更新:推荐使用Waline评论系统,原因参考:Valine的问题
Waline使用时应当注意serverURL末尾不能加”/“,否则会造成前端跨域问题。
前言
博客的评论系统用的是Valine,Valine是一款基于LeanCloud的快速、简洁且高效的无后端评论系统。弄好了之后就没再关心Valine(其实是没有评论)了。直到某天看到有些文章的评论已经有5天了…于是便琢磨加个邮件通知功能,最后找到了这个项目Valine-Admin。按照说明在Leancloud部署源码和添加环境变量后成功开启邮件通知功能,但是白嫖的东西并不会那么完美(留下了穷人的泪水)…
Leancloud休眠策略
Leancloud的体验实例会有休眠策略:
- 如果应用最近一段时间(半小时)没有任何外部请求,则休眠。
- 休眠后如果有新的外部请求实例则马上启动。访问者的体验是第一个请求响应时间是 5 ~ 30 秒(视实例启动时间而定),后续访问响应速度恢复正常。
- 强制休眠:如果最近 24 小时内累计运行超过 18 小时,则强制休眠。此时新的请求会收到 503 的错误响应码,该错误可在 云引擎 > 统计 中查看。
而休眠后有新的请求实例会启动,但是此时邮件发送时失败的。在Valine-Admin项目中的解决办法是使用Leancloud的定时器,每天 7 - 23 点每 20 分钟访问一次,这样可以保持每天的绝大多数时间邮件服务是正常的。
4月15日后,官方限制了这一行为,通过定时任务唤醒容器可能会失败,所以只能另寻他法。
云函数唤醒容器
在寻找解决方案的时候看到了这位大佬的文章优雅解决LeanCloud流控问题,其中提到了一种解决思路,Leancloud限制的只是容器的定时任务唤醒,而外部访问依然会激活容器,所以可以通过外部定时任务访问容器来激活容器。能做到定时访问链接的东西有很多,但使用云函数更为简单和稳定。
以腾讯云函数为例,运行环境是Python3.6,函数代码为
1 | import urllib.request |
其中第三行的”your URL”为绑定的云引擎外部访问域名。函数的触发器表达式为
1 | 0 */20 7-23 * * * * |
也就是每天 7 - 23 点每 20 分钟访问一次,这样可以保证每天的7点整到24点整能够正常使用,其他时间的评论可以添加定时任务【邮件补发】,在每天特定时间补发邮件,如表达式
1 | 0 0 8 * * ? |
就是在每天8点补发邮件,这样就能保证评论邮件提醒不会漏发了。
最后还是要感谢Leancloud提供的Valine评论系统(又可以继续白嫖)。