Google Spreadsheets API (узел js) - добавление повторной попытки при ошибке Служба в настоящее время недоступна

У меня есть приложение с полным стеком, которое принимает ввод от пользователя и отправляет данные в электронную таблицу Google, используя их службу API.

Служба работала отлично до тех пор, пока несколько месяцев назад не удалось отправить один из запросов от клиента, и мы получили сообщение об ошибке: 2020-03-09T11: 42: 49.035293 + 00: 00 app [web.1]: API вернул ошибка: Ошибка: служба в настоящее время недоступна.

После исследования эта ошибка относится к 503, и решением будет повторить попытку, поэтому я решил использовать пакет npm под названием 'retry' и добавил его внутри функции «listMajors» (см. Пример Spreadsheets API в: https://developers.google.com/sheets/api/quickstart/nodejs), вот так :

   function listMajors(auth) {
     const sheets = google.sheets({version: 'v4', auth});
     // 3 Attempt wrapper
     function listMajorsWrapper(callback) {
       operation.attempt(function(currentAttempt) {
         sheets.spreadsheets.values.append({
           spreadsheetId: config.spreadsheetId,
           range: 'Requests',
           valueInputOption: 'USER_ENTERED',
           insertDataOption: 'INSERT_ROWS',
           resource: {
             "values":
             [
               data
             ]
           }
         }, (err, res) => {
           if (operation.retry(err)) {
               return;
           }
           callback(err ? operation.mainError() : null, res);
           //if (err) return console.log('The API returned an error: ' + err);
         });
       })
     }
     listMajorsWrapper(function(err, result) {
       console.log(err, result);
     });
   }

Возможные варианты повтора:

   // RETRY configuration
   var operation = retry.operation({
     retries: 2,            // try 1 time and retry 2 times if needed, total = 3
     minTimeout: 10 * 1000, // the number of milliseconds before starting the first retry
     maxTimeout: 60 * 1000  // the maximum number of milliseconds between two retries
   });

Вчера я сделал около 5 тестов, и два из них дали мне дубликат.

После поиска в журналах я нашел «retry: true».

2020-05-14T13: 46: 52.070771 + 00: 00 приложение [web.1]: 'Content-Type': 'application / json',

2020-05-14T13: 46: 52.070772 + 00: 00 app [web.1]: Accept: 'application / json'},

2020-05-14T13: 46: 52.070772 + 00: 00 приложение [web.1]: params:

2020-05-14T13: 46: 52.070772 + 00: 00 приложение [web.1]: {valueInputOption: 'USER_ENTERED',

2020-05-14T13: 46: 52.070773 + 00: 00 приложение [web.1]: insertDataOption: 'INSERT_ROWS'},

2020-05-14T13: 46: 52.070773 + 00: 00 приложение [web.1]: validateStatus: [Функция],

2020-05-14T13: 46: 52.070773 + 00: 00 приложение [web.1]: retry: true,

Вопросов:

  1. Предлагает ли Google возможность повторной попытки? Если да, то сколько у них повторных попыток?
  2. Это хороший способ закодировать повторную попытку для Spreadsheets API или мне следует сделать что-то другое (у вас есть примеры)?

Редактировать после ответа Алессандро: npm retry использует экспоненциальную отсрочку ‹- это правильный подход к повторной попытке

Новое -> "Добавлен тайм-аут"

Будет ли это ждать, пока сначала произойдет повторная попытка Google, и избежать дублирования, или просто задержит первоначальную проверку?

Вчера я сделал несколько тестов и не увидел дубликата, но это не значит, что он все еще правильный. Я не уверен на 100%.

    setTimeout(function() {
       if (operation.retry(err)) {
         return;
       }
       callback(err ? operation.mainError() : null, res);
    }, 10000)

person Abak    schedule 14.05.2020    source источник


Ответы (1)


Подход

Поскольку природа ошибки 503 временная, это хороший подход для реализации логики повтора в вашем приложении. Google рекомендует стратегию под названием Экспоненциальный откат. Он используется для улучшения использования полосы пропускания и увеличения пропускной способности запросов в параллельных средах.

Примеры

Экспоненциальный откат Google - теория

Google Exponential Backoff - образцы

person Alessandro    schedule 15.05.2020
comment
Спасибо за этот ответ. Несмотря на то, что это нацелено на Cloud IoT, а не на Spreadsheets API, это указывало мне на правильное направление. Пакет retry npm делает именно то, что, по их словам, должен делать экспоненциальный откат ... Единственное, что я сделал, это добавил тайм-аут перед проверкой ошибки. Таким образом, дубликат не будет запускаться, если у Google также есть повторная попытка. Надеюсь, это решит проблему или просто задержит первоначальную проверку. - person Abak; 19.05.2020