【该问题可能已修复,以下为原文】
这个插件吧,有点儿不完美,给他改了改,不完美的地方就是,leancloud那边儿没法短时间内接受太多请求。原因是我用的是免费版的,有限制,而hexo-leancloud-counter-security 插件每次发太多无用请求,总是会报429错误,我就给源代码改了改。
症状
如果你懒得看解释的话,直接去看修改代码一节。
每次进行hexo d
的时候会概率性的出现如下错误:
1 | ERROR Too many requests. [429 POST https://xtppdvlr.api.lncld.net/1.1/classes/Counter] |
官方解释如下:
信息 - Too many requests.
含义 - 超过应用的流控限制,即超过每个应用同一时刻最多可使用的工作线程数,或者说同一时刻最多可以同时处理的数据请求。通过 控制台 > 存储 > API 统计 > API 性能 > 总览 可以查看应用产生的请求统计数据,如平均工作线程、平均响应时间等。使用 LeanCloud 商用版或企业版 的用户,如有需要,可以联系我们来调整工作线程数。
原因
我查看了源代码,node_modules\hexo-leancloud-counter-security\index.js
这个就是源代码。发现每次进行hexo d的时候,他对每个博文的title和url,向leancloud发送一次查询请求,如果发现leancloud那边儿没有该条记录的话,那么再发送一条插入请求。
原逻辑如下:
1 | _.forEach(urls, function (x) { |
也就是说,每一次hexo d
的时候最少的查询次数等于你的博文个数。如果你的leancloud的应用的处理能力不够强大的时候,对于这种高强度的请求,当然会出现Too Many Requests的错误代码。
改进思路
我们要做的就是较少不必要的请求咯。
本地记录一个title和url的json数组,每次查询这个数组,看看哪些是真正的需要查询的,然后再去查询leancloud。其实可以这样理解,这个本地的数组存储就是leancloud的远程数据库表。
因为筛除了一些记录,所以每次hexo d时的请求数量仅仅是相比上一次hexo d时候的增量。
修改代码
如果你遇到了问题,看看问题解决一节。
修改的是node_modules\hexo-leancloud-counter-security\index.js
这个文件
hexo-leancloud-counter-security版本是1.3.2
一共修改下面几处,在代码中已经做了标记。
代码70-84
代码87-102
代码113-117
代码120-123
代码126-132
代码135-138
代码140-142
代码225-268
改完了之后别着急,打开博客配置文件
找到skip_render:
这一项,然后加上leancloud_memo.json。不会加的看修改博客配置文件一节。
1 | ; |
修改博客配置文件
我们需要将leancloud_memo.json排除,否则的话会被渲染,我那个反正就是被渲染了。
在博客配置文件
中找到这个,然后加一项,如下:
1 | skip_render: leancloud_memo.json |
如果有多个项的话,可以这么加:
1 | skip_render: |
关键逻辑
维护memoData和urls数组有序,能够在O(2n)的复杂度内判断出有哪些博文(包括改了题目的,改了文件名的)不在表中。
最后的memoData和newData也是有序的,产生的新的文件也是有序的。
详见代码,不做过多解释。
额外代价
分析一下,额外引入的代价。
时间上的代价:
- 对urls数组进行排序。O(nlogn)
- urls数组和memoData数组比较以确定某个记录需要向leancloud查询。O(2n)
- 排序newData数组。O(nlogn)
- 将memoData和newData数组整合成一个新的数组。O(2n)
- 将memoData字符串split成数组一次。
- 读取memoData一次。
- 写memoData n次。
- 拷贝memoData一次。
空间上的代价:
- 引入newData数组,O(n)
- 引入memoData数组,O(n)
- 引入一个文件leancloud_memo.json
n是博文的数量,一般的话假设有1万篇,这个额外代价感觉还可以。
最后一行不加注释
为什么不在上面代码最后艺一行加上//—-end—-?因为加上注释以后会报错。报错如下:
1 | ERROR Plugin load failed: hexo-leancloud-counter-security |
问题解决
如果你在hexo d
的时候,发现leancloud那边儿没有添加上记录。排除了各种错误之后,还是没有的话。
你可以把source文件夹下的leancloud_memo.json文件删除,然后重新hexo clean & hexo g & hexo d
就好了。