我使用Analytics Real Time Reporting API每小时在我的雇主网站上提取热门新闻,以便在我们的主页上放入趋势项目模块 . 过去几周我一直收到谷歌的电子邮件说:
8.65%的请求导致rateLimitExceeded或userRateLimitExceeded错误 . 此错误表示您的项目达到了QPS限制 . 降低对Analytics API的调用频率将减少错误数量并节省每日配额 .
奇怪的是,据我所知,我的应用程序应该每小时只进行一次调用,因为我将响应存储在Redis中并引用缓存的数据直到它过期 . Google API信息中心的统计数据似乎反映了这一点(Screencap from GA Dashboard) .
我还添加了指数退避,正如谷歌之前的一封电子邮件推荐的那样,以确保在请求失败后我没有经常重试:
const params = {
'auth': jwtClient,
'ids': process.env.GA_ID,
'metrics': 'rt:pageViews',
'dimensions': 'rt:pagePath',
'max-results': '50',
'sort': '-rt:pageViews',
'key': process.env.GA_KEY
}
function fetchTrending() {
return new Promise ((resolve, reject) => {
jwtClient.authorize(err => { if (err) { reject(err) } })
const getAnalytics = backoff.call(analytics.data.realtime.get, params, (error, body) => {
if (body != null && error == null) {
resolve(body)
} else {
reject(error)
}
})
getAnalytics
.retryIf(err => { return err.status == 503 })
.setStrategy(new backoff.ExponentialStrategy())
.failAfter(10)
.start()
})
}
function trending () {
return new Promise ((resolve, reject) => {
cache('gaData', 3600, () => {
return new Promise ((resolve, reject) => {
fetchTrending()
.then(gaData => {
resolve(gaData)
}).catch(error => {
reject(error)
})
})
})
[etc.]
缓存脚本基本上说,检查Redis中是否存在密钥,如果是,则返回该数据,否则执行传递的函数 .
那么,为什么我会以如此少的请求达到Google的API限制?我该怎么做才能缓解这个问题,以便减少“未经授权”的错误率?