前言

最近好多人遇到了"因流控原因,通过定时任务唤醒体验版实例失败,建议升级至标准版云引擎实例避免休眠"。我也遇到了这种问题,太难受了。难道白嫖结束了,羊被薅死了?

但我还是不甘心,于是只能另寻他法。

首先看到官方所说:

既然是同一时刻,那么是不是意味着只要搓开时间就可以了呢?

我便调整时间尝试了几天,第一天还好,但以后便又出现了流控导致的失败。

image-20200514225944504

因此,调整时间避免的方案治标不治本。还需另寻他法。

目前方案

  1. 修改定时任务的唤醒时间

    这个方案在上边我已经介绍过了,治标不治本。这里我并不推荐。

  2. 在博客多加入一条请求。

    也就说每一次访问博客时,将leancloud唤醒。这种方法可以,这也是我最先想到的,但无疑,这会在一定程度上拖慢博客加载速度。

  3. 第二个方案的变种

    为什么说是变种。因为也是加一个请求,只不过不会在你博客加,那么加在哪里呢?请继续往后看。

优雅解决

解决方案其实真的还蛮多的。因为方案很多,我也不可能每种方案都写一篇详细的小白教程,因此发现或者想到新方案后,我会将思路分享给大家。至于具体如何操作,请自己动手,详细过程不可能再会给出教程(特别繁琐除外),本文只会给出一些关键性的代码(脚本),以及代码(脚本)如何使用。

此篇文章详细介绍方案一的做法,其他方案为2020年05月18日后补方案

LeanCloud的机器唤醒其实还有一种方式。详情请看休眠策略

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

那么我们只要每三十分钟之内在外部访问一次不就可以解决了么?

于是我查看了一下valine-admin的唤醒源代码,自唤醒云函数也是这样实现的。于是便继续开始白嫖。阿鲁小表情-小康博客

思路脑图

以下所有方案均遵循这里的脑图思路。如果小白博客请看懂思路后在尝试。不要无脑复制!不要无脑复制!不要无脑复制!

思路:通过某种(下边的任意一种)方式,从外部get你的评论后台地址

不是get你的博客地址。一定是评论后台地址!所有的方式都是评论后台地址,所有的方式都与博客地址没有半毛钱关系!

不是get你的博客地址。一定是评论后台地址!所有的方式都是评论后台地址,所有的方式都与博客地址没有半毛钱关系!

不是get你的博客地址。一定是评论后台地址!所有的方式都是评论后台地址,所有的方式都与博客地址没有半毛钱关系!

开始尝试

这里我使用的是GitHub+Actions。是不是很熟悉,自动部署也是这个方案呢。

  1. 鼠标放在右上角,选择setting

  2. 点击Developer settings

  3. 选择Personal access tokens,添加一个新的TOKEN。

    这个TOKEN主要使用来启动actions和上传结果用的。

    设置名字为GITHUB_TOKEN , 然后勾选 repo , admin:repo_hook , workflow 等选项,最后点击Generate token即可。

    image-20200515211343057

    名字请务必使用GITHUB_TOKEN

  4. 接下来FORK项目。

    地址:https://github.com/blogimg/WakeLeanCloud

    如果觉得好用可以点个赞哦!

  5. 成功FORK后,进入项目的设置。添加你的leancloud的后台地址(也就是评论管理的后台地址)

    选择Secrets,添加你的评论后台地址一定是Leancloud的后台地址(环境变量ADMIN_URL),而不是你的博客地址。

    SITE的网址应填你的评论管理后台地址,而不是博客地址。

    其中Name的名字必须为SITE,Value可以是多个后台地址(注意请求头也要写),用英文逗号分隔。不要中中文逗号,不要用中文逗号,不要用中文逗号

    valine后台地址(你的页面可能与我略有差异,但一定要出现一个类似的页面):

    image-20200609085422749

  6. 接下来对自己的项目点个star就能启动了,启动后请切换到actions,看看是否运行成功。

    • 成功

      那么你就可以关掉了,默认是每天8:00-24:00时每20分钟运行一次。(GitHub时间稍有延迟,大概时2-5分钟。)

      成功示意图

    • 失败

      如果你的GitHub从来没有用过actions,那么需要先“了解”。方法很简单,点击绿色的按钮即可。

      image-20200525093352663

      其他问题:请认真看本教程并且思考为什么这么做,你就能想到你是哪里出了问题。

    自己点自己的项目是手动执行一次actions。是为了测试才设计这个功能的哦!

    并不是不点星这个actions就不会运行。

  7. 最后,如果觉得好用,请给我点个star哦!

其他解决方案

这里为2020-05-18之后补充的其他方案。

方案二

利用国内的云函数,自己写一个脚本。然后定时监控即可。

或者宝塔、自己服务器的定时任务都是可以的。

方案三

cloudflareWorkers可以在线定义脚本,通过链接即可触发脚本。

因此定义好自己的脚本后,通过监控即可触发来实现唤醒LeanCloud

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
addEventListener('fetch', (event) => {
return event.respondWith(handleRequest(event.request));
})

const handleRequest = async (request) => {
const render = (body) => {
return new Response(`
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>唤醒你的LeanCloud</title>
</head>
<body>${body}</body>
</html>`.trim(), {
status: 200,
headers: {
'Content-Type': 'text/html; charset=utf-8'
}
});
}
var date = new Date();
var hour = date.getHours();
var minutes = date.getMinutes;
// 事件控制,因此事件采用utc时间,因此需要手动-8
if (hour >= 0 && hour <= 15) {
// 列表里添加你的评论管理后台地址
const Urls = ['https://www.antmoe.com/','https://www.tzki.cn/']
var result = ''
for(var i=0;i<Urls.length;i++){
const response = await fetch(Urls[i]);
const html = await response.status;
result+=Urls[i]+ "状态:"+html+'<br />'
}
return render(`
${result}<br />
`);
}else{
return render(`当前是休息时间哦!<br />`);
}
}

监控平台:https://uptimerobot.com/ 监控地址就是Workers的地址。监控频率看你自己。

另外网友track13评论到:其实只外部要唤醒一次就可以,之后都可以交给leancloud的定时任务。

方案四

通过cron-job平台进行监控。注册地址:https://cron-job.org/en/signup/

  1. 注册

    时区请选择Asia/Shanghai,否则请手动下边的操作请手动换算时间。另外关于最下边的谷歌验证如果出不来,请采用特殊方式。这里不过多介绍。

  2. 登录账号

    首先去邮箱激活一下账号哦!邮件可能在垃圾箱哦!

  3. 添加任务

    登陆之后依次点击 Members,cronjobs,Create cronjob

    image-20200524163630403

  4. 各项配置的解释

    字段简单解释补充说明
    Title任务名称
    Address监控地址Leancloud 的 Web 主机域名,也就是环境变量的ADMIN_URL
    Schedule任务周期分别为每X分钟执行、每天H:MM执行、每月DD日HH:MM执行、自定义
    Notifications提醒通知
    Save responses保存日志
  5. 配置示例

    关于自定义时间,你勾哪个就会在哪个时间段执行。例如五个框里你全选了,那么会每分钟都会执行。因此请各位博主自己想好需要在哪个时间段唤醒,而不是无脑复制

    点下第一个,在按住shift点最后一个,会权限所有哦!另外ctrl可以多选

问题

  1. 修改频率(时间)

    修改.github/workflows/autoWakeup.yml文件中的cron表达式即可。

  2. 后台地址会不会暴露

    不会的

  3. 没有效果

    请确保你的第五步成功添加了网址,如果没有添加也会定时执行actions的动作而不会报错。可以在详情里查看是否监控的你的地址。正常情况下会如下图所以,多个网址会依次排列。如果没有填写网址则会默认访问作者的博客。

    image-20200515211712029

  4. 每次都会commit,太多了。

    其实可以每天只运行一次,然后其他时间还是依靠定时函数来完成。例如我将actions的时间修改为每天早上8:00运行一次。而其他时间通过定时函数唤醒。这样理论上也是没问题的。

    Actions的时间是按UTC时间计算的,因此设置时请手动将时间换算成UTC时间哦!

最后

既然用上了valine,那么我想再次安利下我魔改的valine-admin哦!

项目地址:https://github.com/sviptzk/Valine-Admin-Server

教程地址:https://www.antmoe.com/posts/2380732b/index.html

相较于原版的优势如下:

微信提醒(基于方糖公众号)

QQ提醒(基于QMSG)

一套很漂亮的邮件模板(基于🎉梨花町の肾兄さん🎉的魔改)

一个漂亮的后台页面(基于懒人大佬)

适配国际版的时区问题

更多特性正在研发!