我有一个完整的堆栈应用程序,可以从用户那里获取输入,并使用其API服务将数据发布到Google Spreadsheet。
该服务运行良好,直到几个月前,一个客户的请求之一未能发布,并给了我们错误:2020-03-09T11:42:49.035293 + 00:00应用程序[web.1]:API返回错误:错误:该服务当前不可用。
[调查后,此错误涉及503,解决方案是重试,因此我决定使用一个名为'retry'的npm程序包,并将其添加到“ listMajors”函数中(请参见https://developers.google.com/sheets/api/quickstart/nodejs中的Spreadsheets API示例),就像这样:
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项测试,其中两项给了我重复。
搜索日志后,我发现“重试:正确”。
2020-05-14T13:46:52.070771 + 00:00 app [web.1]:'Content-Type':'application / json',
2020-05-14T13:46:52.070772 + 00:00 app [web.1]:接受:'application / json'},
2020-05-14T13:46:52.070772 + 00:00 app [web.1]:参数:
2020-05-14T13:46:52.070772 + 00:00 app [web.1]:{valueInputOption:'USER_ENTERED',
2020-05-14T13:46:52.070773 + 00:00 app [web.1]:insertDataOption:'INSERT_ROWS'},
2020-05-14T13:46:52.070773 + 00:00 app [web.1]:validateStatus:[Function],
2020-05-14T13:46:52.070773 + 00:00 app [web.1]:重试:是,
问题:
在亚历山德罗回应后编辑:npm重试使用指数退避
新->“添加了超时”]
将等待Google重试,然后避免重复或只是延迟初始检查吗?
我昨天进行了几次测试,但没有看到重复的记录,但这并不意味着它仍然正确。我不确定100%。
setTimeout(function() {
if (operation.retry(err)) {
return;
}
callback(err ? operation.mainError() : null, res);
}, 10000)
由于错误503的性质是瞬态的,所以是在您的应用程序中实现重试逻辑的好方法。Google建议一种称为指数退避的策略。它用于提高带宽利用率并在并发环境中最大化请求的吞吐量。