优雅解决LeanCloud流控问题
前言
由于作者已放弃 valine 评论,故关于此评论有关的项目均已放弃。
最近好多人遇到了"因流控原因,通过定时任务唤醒体验版实例失败,建议升级至标准版云引擎实例避免休眠"。我也遇到了这种问题,太难受了。难道白嫖结束了,羊被薅死了?
但我还是不甘心,于是只能另寻他法。
首先看到官方所说:
既然是同一时刻,那么是不是意味着只要搓开时间就可以了呢?
我便调整时间尝试了几天,第一天还好,但以后便又出现了流控导致的失败。
因此,调整时间避免的方案治标不治本。还需另寻他法。
目前方案
修改定时任务的唤醒时间
这个方案在上边我已经介绍过了,治标不治本。这里我并不推荐。
在博客多加入一条请求。
也就说每一次访问博客时,将 leancloud 唤醒。这种方法可以,这也是我最先想到的,但无疑,这会在一定程度上拖慢博客加载速度。
第二个方案的变种
为什么说是变种。因为也是加一个请求,只不过不会在你博客加,那么加在哪里呢?请继续往后看。
优雅解决
解决方案其实真的还蛮多的。因为方案很多,我也不可能每种方案都写一篇详细的小白教程,因此发现或者想到新方案后,我会将思路分享给大家。至于具体如何操作,请自己动手,详细过程不可能再会给出教程(特别繁琐除外),本文只会给出一些关键性的代码(脚本),以及代码(脚本)如何使用。
此篇文章详细介绍方案一的做法,其他方案为 2020 年 05 月 18 日后补方案
LeanCloud 的机器唤醒其实还有一种方式。详情请看休眠策略。
- 如果应用最近一段时间(半小时)没有任何外部请求,则休眠。
- 休眠后如果有新的外部请求实例则马上启动。访问者的体验是第一个请求响应时间是 5 ~ 30 秒(视实例启动时间而定),后续访问响应速度恢复正常。
- 强制休眠:如果最近 24 小时内累计运行超过 18 小时,则强制休眠。此时新的请求会收到 503 的错误响应码,该错误可在 云引擎 > 统计 中查看。
那么我们只要每三十分钟之内在外部访问一次不就可以解决了么?
于是我查看了一下valine-admin
的唤醒源代码,自唤醒云函数也是这样实现的。于是便继续开始白嫖。
思路脑图
以下所有方案均遵循这里的脑图思路。如果小白博客请看懂思路后在尝试。不要无脑复制!不要无脑复制!不要无脑复制!
思路:通过某种(下边的任意一种)方式,从外部 get 你的评论后台地址。
不是get你的博客地址。一定是评论后台地址!所有的方式都是评论后台地址,所有的方式都与博客地址没有半毛钱关系!
不是get你的博客地址。一定是评论后台地址!所有的方式都是评论后台地址,所有的方式都与博客地址没有半毛钱关系!
不是get你的博客地址。一定是评论后台地址!所有的方式都是评论后台地址,所有的方式都与博客地址没有半毛钱关系!
开始尝试
这里我使用的是 GitHub+Actions。是不是很熟悉,自动部署也是这个方案呢。
鼠标放在右上角,选择 setting
点击
Developer settings
。选择
Personal access tokens
,添加一个新的 TOKEN。这个 TOKEN 主要使用来启动 actions 和上传结果用的。
设置名字为
GITHUB_TOKEN
, 然后勾选 repo , admin:repo_hook , workflow 等选项,最后点击 Generate token 即可。名字请务必使用
GITHUB_TOKEN
。接下来 FORK 项目。
地址:https://github.com/blogimg/WakeLeanCloud
如果觉得好用可以点个赞哦!
成功 FORK 后,进入项目的设置。添加你的 leancloud 的后台地址(也就是评论管理的后台地址)
选择 Secrets,添加你的评论后台地址,一定是 Leancloud 的后台地址(环境变量 ADMIN_URL),而不是你的博客地址。
SITE的网址应填你的评论管理后台地址,而不是博客地址。
其中 Name 的名字必须为
SITE
,Value 可以是多个后台地址(注意请求头也要写),用英文逗号分隔。不要中中文逗号,不要用中文逗号,不要用中文逗号valine 后台地址(你的页面可能与我略有差异,但一定要出现一个类似的页面):
接下来对自己的项目点个 star 就能启动了,启动后请切换到 actions,看看是否运行成功。
成功
那么你就可以关掉了,默认是每天 8:00-24:00 时每 20 分钟运行一次。(GitHub 时间稍有延迟,大概时 2-5 分钟。)
失败
如果你的 GitHub 从来没有用过 actions,那么需要先“了解”。方法很简单,点击绿色的按钮即可。
其他问题:请认真看本教程并且思考为什么这么做,你就能想到你是哪里出了问题。
自己点自己的项目是手动执行一次 actions。是为了测试才设计这个功能的哦!
并不是不点星这个 actions 就不会运行。
最后,如果觉得好用,请给我点个 star 哦!
其他解决方案
这里为2020-05-18之后补充的其他方案。
方案二
利用国内的云函数,自己写一个脚本。然后定时监控即可。
或者宝塔、自己服务器的定时任务都是可以的。
方案三
cloudflare
的Workers
可以在线定义脚本,通过链接即可触发脚本。
因此定义好自己的脚本后,通过监控即可触发来实现唤醒 LeanCloud
1 | addEventListener('fetch', (event) => { |
监控平台:https://uptimerobot.com/ 监控地址就是 Workers 的地址。监控频率看你自己。
另外网友track13评论到:其实只外部要唤醒一次就可以,之后都可以交给 leancloud 的定时任务。
方案四
通过cron-job
平台进行监控。注册地址:https://cron-job.org/en/signup/
注册
时区请选择
Asia/Shanghai
,否则请手动下边的操作请手动换算时间。另外关于最下边的谷歌验证如果出不来,请采用特殊方式。这里不过多介绍。登录账号
首先去邮箱激活一下账号哦!邮件可能在垃圾箱哦!
添加任务
登陆之后依次点击
Members
,cronjobs
,Create cronjob
各项配置的解释
字段 简单解释 补充说明 Title
任务名称 Address
监控地址 Leancloud 的 Web 主机域名
,也就是环境变量的ADMIN_URL
Schedule
任务周期 分别为每 X 分钟执行、每天 H:MM 执行、每月 DD 日 HH:MM 执行、自定义 Notifications
提醒通知 Save responses
保存日志 配置示例
关于自定义时间,你勾哪个就会在哪个时间段执行。例如五个框里你全选了,那么会每分钟都会执行。因此请各位博主自己想好需要在哪个时间段唤醒,而不是无脑复制。
点下第一个,在按住
shift
点最后一个,会全选所有哦!另外ctrl
可以多选
问题
修改频率(时间)
修改
.github/workflows/autoWakeup.yml
文件中的cron
表达式即可。后台地址会不会暴露
不会的
没有效果
请确保你的第五步成功添加了网址,如果没有添加也会定时执行 actions 的动作而不会报错。可以在详情里查看是否监控的你的地址。正常情况下会如下图所以,多个网址会依次排列。如果没有填写网址则会默认访问作者的博客。
每次都会 commit,太多了。
其实可以每天只运行一次,然后其他时间还是依靠定时函数来完成。例如我将 actions 的时间修改为每天早上 8:00 运行一次。而其他时间通过定时函数唤醒。这样理论上也是没问题的。
Actions 的时间是按 UTC 时间计算的,因此设置时请手动将时间换算成 UTC 时间哦!
最后
既然用上了 valine,那么我想再次安利下我魔改的 valine-admin 哦!
项目地址:https://github.com/sviptzk/Valine-Admin-Server
教程地址:https://blog.antmoe.com/posts/2380732b/index.html
相较于原版的优势如下:
微信提醒(基于方糖公众号)
QQ提醒(基于QMSG)
一套很漂亮的邮件模板(基于🎉梨花町の肾兄さん🎉的魔改)
一个漂亮的后台页面(基于懒人大佬)
适配国际版的时区问题
更多特性正在研发!