换个方式解决LeanCloud流控问题

0x1 缘起

引入了博客和文档网站的评论Valine,但是邮件发送带来了新的问题。

0x2 问题

“开局一张图,内容全靠编”接触Valine并没多久,配置了邮件发送,用到了LeanCloud的云引擎。发现经常出现定时器无法唤醒。LeanCloud也给了解释,用的人很多,系统负载大。不给你白嫖了。

这对于白嫖怪是无法忍受的,随即上网寻找解决办法。看到 优雅解决LeanCloud流控问题,基本可以从根本上解决问题。

0x3 冷静分析

文章中用到了Github action去定时请求文章管理的后台地址唤醒实例,这就很简单了。核心就是云引擎在收到外部请求的时候会被唤醒,但是Github action用起来略麻烦,“杀鸡用牛刀”的感觉。

0x4 问题解决

结合之前写签到脚本的经验,加上自己服务器实在没啥事情干。遂写个定时唤醒脚本配上Qmsg酱来推送,岂不美哉~,上脚本,很简单,没啥技术含量~

/**
 * @name: lean-cloud
 * @author: SunSeekerX
 * @Date: 2020-05-18 16:45:37
 * @LastEditors: SunSeekerX
 * @LastEditTime: 2020-05-20 18:47:27
 */

const axios = require('axios')
const schedule = require('node-schedule')
const moment = require('moment')
const chalk = require('chalk')
const log = console.log

/**
 * @name 配置信息
 */
const config = {
  // 是否打开Qmsg酱
  isOpenQmsg: true,
  // Qmsg酱的key
  qmsgKey: '',
  // Valine应用
  valines: [
    // SunSeekerX - Doc
    {
      // 应用名
      name: 'SunSeekerX - Doc',
      // 评论管理地址
      url: 'https://leanapp-sunseekerx.yoouu.cn/comments',
    },
    // SunSeekerX - Ghost
    {
      // 应用名
      name: 'SunSeekerX - Ghost',
      // 评论管理地址
      url: 'https://leanapp-ghost.yoouu.cn/comments',
    },
  ],
}

/**
 * @name 定时任务
 * @description Every 25 minutes, between 07:00 AM and 11:59 PM
 */
schedule.scheduleJob('0 */25 7-23 * * *', () => {
  // 干活~
  doWork()
})

/**
 * @name 别说了,干活~~~
 */
async function doWork() {
  const { valines } = config
  if (valines.length) {
    // 结果对象
    const result = []
    for (const item of valines) {
      try {
        const res = await axios({
          url: item.url,
          method: 'get',
        })
        // 判断http请求是否成功
        if (res.status === 200) {
          result.push({
            name: item.name,
            // data: res,
            message: `${moment(new Date()).format(
              'YYYY-MM-DD HH:mm:ss'
            )} 唤醒成功`,
            success: true,
          })
        } else {
          result.push({
            name: item.name,
            error: res.status,
            message: `${moment(new Date()).format(
              'YYYY-MM-DD HH:mm:ss'
            )} 请求出错`,
            success: false,
          })
        }
      } catch (error) {
        // 请求失败
        result.push({
          name: item.name,
          // data: res,
          message: `${moment(new Date()).format(
            'YYYY-MM-DD HH:mm:ss'
          )} 请求失败`,
          error: error.message,
          success: false,
        })
      }
    }
    // 推送
    let resultStr = ``
    for (const item of result) {
      resultStr += `${item.name}\n`
      resultStr += `${item.message}\n`
      if (!item.success) {
        resultStr += `${item.error}\n`
      }
      resultStr += `-------------\n`
    }
    if (config.isOpenQmsg) {
      qmsg(resultStr)
    }
    log(chalk.blue(resultStr))
  } else {
    log(chalk.red('你没有配置valines应用啦,到config添加几个💔'))
  }
}

/**
 * @name Qmsg酱推送
 * @param { String } msg 推送信息文本
 */
async function qmsg(msg) {
  try {
    const res = await axios({
      method: 'get',
      url: `https://qmsg.zendee.cn:443/send/${config.qmsgKey}.html`,
      params: {
        msg,
      },
    })
    if (!res.data.success) {
      log(
        chalk.red(
          `Qmsg酱发送失败:${moment(new Date()).format('YYYY-MM-DD HH:mm:ss')}`
        ),
        res.data
      )
    }
  } catch (error) {
    console.log(error.message)
  }
}

// 启动提示
log(
  chalk.bgGreen.black(
    `启动成功>>>:${moment(new Date()).format('YYYY-MM-DD HH:mm:ss')}`
  )
)

GitHub地址:https://github.com/SunSeekerX/node-script/tree/master/lean-cloud

付费是不可能付费的,这辈子都不可能付费的,只有白嫖才能维持得了生活的样子~