【问题标题】:Exception: Quota Error: User Rate Limit Exceeded异常:配额错误:超出用户速率限制
【发布时间】:2013-02-11 20:01:23
【问题描述】:

我有一个 Apps 脚本,我在其中循环遍历我的 Google Analytics(分析)帐户,直到我到达 某个 Profile。
if (profileItems[i].getName() == "Dev Test" )
与在另一个函数中(见下文)相比,我调用 Google Analytics API 并总是抛出异常:异常:配额错误:超出用户速率限制

function getReportDataForProfile(profileId) {
var tableId = 'ga:' + profileId;
var startDate = getLastNdays(14);   // 2 weeks (a fortnight) ago.
var endDate = getLastNdays(0);      // Today.

var optArgs = {
  'dimensions': 'ga:keyword',              // Comma separated list of dimensions.
  'sort': '-ga:visits,ga:keyword',         // Sort by visits descending, then keyword.
  'segment': 'dynamic::ga:isMobile==Yes',  // Process only mobile traffic.
  'filters': 'ga:source==google',          // Display only google traffic.
  'start-index': '1',
  'max-results': '250'                     // Display the first 250 results.
};

//
//Exponential Backoff
//
for (var n=0; n<6; n++) {
try {
     var results = Analytics.Data.Ga.get(
     tableId,                  // Table id (format ga:xxxxxx).
     startDate,                // Start-date (format yyyy-MM-dd).
     endDate,                  // End-date (format yyyy-MM-dd).
     'ga:visits,ga:pageviews', // Comma seperated list of metrics.
     optArgs);
 } catch(e) {
   if (n == 5) {
     //var results = e;
     //throw new Error('Quota ERROR');
     throw (e) 
   } 
   Utilities.sleep((Math.pow(2,n)*1000) + (Math.round(Math.random() * 1000)));
  }    
}   
 return results;
}   
  • 我将 API 控制台中的每用户限制数量增加到 10.0
  • 使用率是 6%
  • 我应用了指数退避
  • 我也相信,仅仅要求访问次数和页面浏览量我不是 夸大我的电话数量。

The full code

任何想法是怎么回事?

【问题讨论】:

    标签: google-apps-script google-analytics-api google-api-console


    【解决方案1】:

    这确实是因为您不允许每秒查询超过 10 个请求。我在这里发布一个解决方案(即使这是一个老问题),因为它可能对其他人有所帮助:

    /**
     * CallLimiter
     * @param {Number} numberOfCalls how many calls per duration are we allowed to do
     * @param {Number} duration      duration in ms
     */
    function CallLimiter(numberOfCalls, duration){
      var lastCall = 0;
      var tokens   = 0;
    
      return function limiter(f){
        var now = +new Date();
    
        if (now - lastCall > duration) {
          tokens = numberOfCalls;
        }
    
        if (tokens <= 0) {
          tokens = numberOfCalls;
          // wait for `duration` before calling limiter(f) again
          return setTimeout(limiter.bind(this, f), duration);
        }
    
        tokens--;
        lastCall = now;
        f();
      };
    }
    

    这里是如何使用它:

    // Stub...
    var Analytics = {Data: {Ga:{get:function(cb){
            cb();
    }}}};
    
    function app(){
      // Wrap the api call inside a limiter
      limiter(function(){
    
        Analytics.Data.Ga.get(function(err, data){
          // do something with the data...
    
          // ... then, loop if necessary
          app();
        });
    
      });
    }
    
    // Start
    app();
    

    这是一个阻塞的 Scala 版本:

    class CallLimiter(rate: Throttler.Rate) {
      var lastCall       = 0
      var duration       = rate.duration.toMillis
      var current_tokens = 0
    
      def apply[A](f: () => A): A = {
        val d = new Date().getTime
    
        if (d - lastCall > duration) {
          current_tokens = rate.numberOfCalls
        }
        if (current_tokens <= 0) {
          // wait for `duration` before calling f()
          Thread.sleep(duration)
          current_tokens = rate.numberOfCalls
        }
        current_tokens = current_tokens - 1
        lastCall = d
        f()
      }
    }
    

    用法:

    import akka.contrib.throttle.Throttler
    
    val limiter = new CallLimiter(new Rate(10, Duration(1, TimeUnit.SECONDS)))
    val accounts = limiter(() => analytics.management().accounts().list().execute().getItems)
    

    【讨论】:

    • 您的解决方案很好,但是如果我有 20 个呼叫等待 10 个呼叫限制,那么您的关键部分会以所有这些呼叫同时被释放而结束,达到速率限制。
    【解决方案2】:

    也许您超出了每个配置文件每秒的最大请求数。看起来它设置为 10 (https://developers.google.com/analytics/devguides/reporting/core/v3/limits-quotas)

    【讨论】:

      【解决方案3】:

      您可以在开发者控制台的配额部分自行更新“每用户速率限制”。

      此限制旨在防止您意外使用。

      您可以在此处了解更多信息: https://developers.google.com/console/help/new/#cappingusage

      【讨论】:

        猜你喜欢
        • 2019-06-02
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-12-13
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        相关资源
        最近更新 更多