我使用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限制?我该怎么做才能缓解这个问题,以便减少“未经授权”的错误率?