У меня есть приложение с полным стеком, которое принимает ввод от пользователя и отправляет данные в электронную таблицу 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,
Вопросов:
- Предлагает ли Google возможность повторной попытки? Если да, то сколько у них повторных попыток?
- Это хороший способ закодировать повторную попытку для Spreadsheets API или мне следует сделать что-то другое (у вас есть примеры)?
Редактировать после ответа Алессандро: npm retry использует экспоненциальную отсрочку ‹- это правильный подход к повторной попытке
Новое -> "Добавлен тайм-аут"
Будет ли это ждать, пока сначала произойдет повторная попытка Google, и избежать дублирования, или просто задержит первоначальную проверку?
Вчера я сделал несколько тестов и не увидел дубликата, но это не значит, что он все еще правильный. Я не уверен на 100%.
setTimeout(function() {
if (operation.retry(err)) {
return;
}
callback(err ? operation.mainError() : null, res);
}, 10000)