0

我有一个完整的堆栈应用程序,它接受用户的输入并使用他们的 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]:重试:真,

问题:

  1. Google 是否提供重试选项?如果是这样,他们有多少次重试?
  2. 这是为电子表格 API 编写重试代码的好方法,还是我应该做一些不同的事情(你有例子)?

在 Alessandro 的回复之后进行编辑:npm retry 使用指数退避 <--这是正确的重试方法

新 --> “添加了超时”

这会等待谷歌重试首先发生并避免重复还是只是延迟初始检查?

我昨天做了几次测试,我没有看到重复,但这并不意味着它仍然是正确的。我不是百分百确定。

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

1 回答 1

1

方法

由于错误 503 的性质是暂时的,因此是在应用程序中实现重试逻辑的好方法。Google 推荐一种称为指数退避的策略。它用于提高带宽使用率并最大化并发环境中的请求吞吐量。

例子

Google 指数退避 - 理论

Google 指数退避 - 示例

于 2020-05-15T07:54:01.793 回答