前言

博客的评论系统用的是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
2
3
4
5
6
7
import urllib.request
def main_handler(event, context):
url="your URL"
req=urllib.request.Request(url)
resp=urllib.request.urlopen(req)

print("外部访问运行完成!")

其中第三行的”your URL”为绑定的云引擎外部访问域名。函数的触发器表达式为

1
0 */20 7-23 * * * *

也就是每天 7 - 23 点每 20 分钟访问一次,这样可以保证每天的7点整到24点整能够正常使用,其他时间的评论可以添加定时任务【邮件补发】,在每天特定时间补发邮件,如表达式

1
0 0 8 * * ?

就是在每天8点补发邮件,这样就能保证评论邮件提醒不会漏发了。

最后还是要感谢Leancloud提供的Valine评论系统(又可以继续白嫖)。