我有一个完整的堆栈应用程序,它接受用户的输入并使用他们的 API 服务将数据发布到谷歌电子表格。
该服务一直运行良好,直到几个月前来自客户端的请求之一未能发布并给我们错误:2020-03-09T11:42:49.035293+00:00 app[web.1]: API 返回错误:错误:该服务当前不可用。
经过调查,这个错误是指 503,解决方案是重试,所以我决定使用一个名为“重试”的 npm 包并将其添加到“listMajors”函数中(参见电子表格 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 次测试,其中两次给了我一个副本。
搜索日志后,我发现“重试:真”。
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 应用程序 [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 应用 [web.1]:重试:真,
问题:
- Google 是否提供重试选项?如果是这样,他们有多少次重试?
- 这是为电子表格 API 编写重试代码的好方法,还是我应该做一些不同的事情(你有例子)?
在 Alessandro 的回复之后进行编辑:npm retry 使用指数退避 <--这是正确的重试方法
新 --> “添加了超时”
这会等待谷歌重试首先发生并避免重复还是只是延迟初始检查?
我昨天做了几次测试,我没有看到重复,但这并不意味着它仍然是正确的。我不是百分百确定。
setTimeout(function() {
if (operation.retry(err)) {
return;
}
callback(err ? operation.mainError() : null, res);
}, 10000)