Google Spreadsheets API(节点js)-添加重试错误“服务当前不可用”

问题描述 投票:0回答:1

我有一个完整的堆栈应用程序,可以从用户那里获取输入,并使用其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]:重试:是,

问题:

  1. Google是否提供重试选项?如果是这样,它们有多少次重试?
  2. 这是编写Spreadsheets API重试代码的好方法,还是我应该做一些不同的事情(您有示例吗?

在亚历山德罗回应后编辑:npm重试使用指数退避

新->“添加了超时”]

将等待Google重试,然后避免重复或只是延迟初始检查吗?

我昨天进行了几次测试,但没有看到重复的记录,但这并不意味着它仍然正确。我不确定100%。

    setTimeout(function() {
       if (operation.retry(err)) {
         return;
       }
       callback(err ? operation.mainError() : null, res);
    }, 10000)
node.js google-sheets-api http-status-code-503 retry-logic
1个回答
1
投票

方法

由于错误503的性质是瞬态的,所以是在您的应用程序中实现重试逻辑的好方法。Google建议一种称为指数退避的策略。它用于提高带宽利用率并在并发环境中最大化请求的吞吐量。

示例

Google Exponential Backoff - Theory

Google Exponential Backoff - Samples

© www.soinside.com 2019 - 2024. All rights reserved.