0

Google Calendar API に対するAbrahamの回答: 「バックエンド エラー」コード 503は、私の状況を正確に表しています。カレンダー エントリを作成または削除するコードをループすると、ランダムな場所で 503 が発生します。

しかし、彼が Google から引用したアドバイスに従う方法がわかりません。エラーをキャッチし、指数バックオフを使用してトランザクションを再試行することです。

以下のコードは、カレンダーに 8 つの新しいイベントを追加するループです。自分のコードではなく、Google API からスローされる 503 エラーがランダムに発生します。多くの場合、エラーなしで動作します。

Google API コードはループから非同期で実行されるため、ループが完了するまで Google アクションは実際には実行されません。非同期コードが 503 をスローしたときに、コードを囲むtry-catchブロックが起動しません。 を使用せずに をcatchコールバック関数に入れることはできません。これtryにより、 の範囲がcatch狭まり、Google のコードが除外されます。

助言がありますか?

/* Special date string format for all-day Google Calendar events.
   Time zone independent.
 */
Date.prototype.yyyy_mm_dd = function() {
    var yyyy= this.getFullYear().toString();
    var mm  = (this.getMonth()+101).toString().slice(-2); //get leading 0
    var dd  = (this.getDate()+100).toString().slice(-2);
    return yyyy+'-'+mm+'-'+dd;
}

var fastevent = {
    'summary': 'Fast',
    'organizer': {
        'self': true, 
        'displayName': 'Wes Rishel', 
        'email': 'wrishel@gmail.com'},
    'start': {'date': 'zzzz'},      // filled in for each instance
    'end': {'date': 'zzzz'},
    'colorId': '11', 
}

function addFastEvents() {
    try {
        var eventDate = calendar.getLastFastDate() || new Date;
        for (var eventCount = 0; eventCount < 8; eventCount++) {

            // advance to next Tuesday or Friday
            eventDate=eventDate.addDays(
                [2, 1, 3, 2, 1, 4, 3][eventDate.getDay()]
            );
            fastevent.start.date = eventDate.yyyy_mm_dd();
            fastevent.end.date = fastevent.start.date;
            var request = gapi.client.calendar.events.insert({
              'calendarId': 'primary',
              'resource': fastevent
            });
            request.execute(function(fastevent) {});
            calendar.getPage(eventDate); 
            calendar.setCellStyle(eventDate, 'fastingweekdaydata');
        } // for
    } catch(e) {
        p(e.message, e.name)
    }
}
4

1 に答える 1

2

指数関数的バックオフは、リクエストをあきらめる前に、特定の回数だけ試行ごとに待機時間を指数関数的に増加させるという手の込んだ言い方です。

指数バックオフの実装

指数関数的バックオフは、ネットワーク アプリケーションの標準的なエラー処理戦略であり、クライアントは失敗した要求を定期的に再試行し、時間の経過とともに増加します。大量のリクエストまたは大量のネットワーク トラフィックが原因でサーバーがエラーを返す場合、これらのエラーを処理するために指数バックオフが適切な戦略である可能性があります。

これは、アイデアを提供するJSのデモコードです。

console.log = consoleLog;

exponentialBackoff(sometimesFails, 10, 100, function(result) {
    console.log('the result is',result);
});

// A function that keeps trying, "toTry" until it returns true or has
// tried "max" number of times. First retry has a delay of "delay".
// "callback" is called upon success.
function exponentialBackoff(toTry, max, delay, callback) {
    console.log('max',max,'next delay',delay);
    var result = toTry();

    if (result) {
        callback(result);
    } else {
        if (max > 0) {
            setTimeout(function() {
                exponentialBackoff(toTry, --max, delay * 2, callback);
            }, delay);

        } else {
             console.log('we give up');   
        }
    }
}

function sometimesFails() {
    var percentFail = 0.8;

    return Math.random() >= 0.8;
}

function consoleLog() {
    var args = [].slice.apply(arguments);

    document.querySelector('#result').innerHTML += '\n' + args.join(' - ');
}
于 2016-10-16T23:36:30.723 に答える