9

Tôi có một Apps Script trong đó Loop lặp lại tài khoản Google Analytics của mình cho đến khi tôi nhận được một cấu hình nhất định.
if (profileItems[i].getName() == "Dev Test")
Thần trong chức năng khác (xem dưới đây) Tôi thực hiện cuộc gọi đến các API của Google Analytics và luôn luôn nhận được sự ngoại lệ ném: Ngoại lệ: hạn ngạch Lỗi: Tỷ lệ tài khoản vượt quá giới hạn

Ngoại lệ: Lỗi hạn ngạch: Giới hạn tỷ lệ người dùng đã vượt quá

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; 
} 
  • Tôi đã tăng số lượng Giới hạn cho mỗi người dùng trong Bảng điều khiển API lên 10.0
  • Tỷ lệ phần trăm được sử dụng là 6%
  • Và tôi đã áp dụng Exponential Backoff
  • Tôi cũng tin rằng bằng cách chỉ hỏi cho Visits và trang truy cập Tôi không exagerating số của tôi về các cuộc gọi.

The full code

Bất kỳ ideias gì đang xảy ra?

Trả lời

2

Đó thực sự là vì bạn không được phép truy vấn hơn 10 yêu cầu mỗi giây. Tôi đăng một giải pháp ở đây (thậm chí nếu đó là một câu hỏi cũ) vì nó có thể giúp đỡ người khác:

/** 
* 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(); 
    }; 
} 

Và đây là làm thế nào để sử dụng nó:

// 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(); 

Và đây là một phiên bản chặn 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() 
    } 
} 

Cách sử dụng:

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) 
+0

giải pháp của bạn là tốt, nhưng nếu tôi có 20 cuộc gọi chờ đợi vào giới hạn 10 cuộc gọi, phần quan trọng của bạn kết thúc với tất cả chúng được phát hành cùng một lúc, chạm giới hạn tốc độ . –

1

Bạn có thể tự cập nhật "giới hạn tốc độ cho mỗi người dùng" trong Bảng điều khiển dành cho nhà phát triển, trong phần Hạn ngạch.

Giới hạn này nhằm bảo vệ bạn khỏi việc sử dụng tình cờ.

Bạn có thể tìm hiểu thêm ở đây: https://developers.google.com/console/help/new/#cappingusage

Các vấn đề liên quan