NodeJSはRetry再試行戦略と返品試行を実現します.

1904 ワード

需要の説明
サービスセンターでは常に異常なトラブルが発生しています.重要な業務に対しては、異常を捕まえて、やり直したり、返品したりします.
例えば、メールサービス.私たちが第三者のSMSサービスを呼び出した場合、ネットワークがタイムアウトしたため、APIの呼び出しに失敗し、ユーザーに認証コードを送信できなくなりました.通常、try...catchを使って異常を捕捉し、再発防止を実施します.しかし、ネットワークの異常によって再び失敗する可能性があります.では、どうやって何度も戦略を試すことができますか?
構想を実現するretryを実装するコア思想は、再帰的に呼び出される.
コードの実装
初版
/**
 *
 * @param {number} retries -     
 * @param {Function} fn -     
 */
const retry = (retries, fn) => {
  fn().catch((err) => retries > 1 ? retry(retries - 1, fn) :  Promise.reject(err));
};
拡張版-遅延を追加して再試行します.
//           
const pause = (duration) => new Promise((reslove) => setTimeout(reslove, duration));

const backoff = (retries, fn, delay = 500) => {
  fn().catch((err) => retries>1
    ? pause(delay).then(() => backoff(retries-1, fn, delay))
    : Promise.reject(err)
  );
}
締め括りをつけるpause関数が実装されている間、後半部分コードの意味がよく分かりませんでした.なぜsetTimeout(reslove, duration)は直接にresloveを伝えられますか?その後、setTimeoutの最初のパラメータは遅延実行が必要な関数であり、reslove自体は関数であることが分かりました.
最後に、setTimeoutのAPI文書を添付します.
*   `callback`              。
*   `delay`     `callback`          。
*   `...args`     `callback`          

setTimeout(callback, delay[, ...args])

    `delay`           `callback`。        [`clearTimeout()`](http://nodejs.cn/s/L4L2Xr)   `Timeout`。

`callback`          `delay`      。 Node.js               ,          。                   。

  :  `delay`    `2147483647`     `1`  ,`delay`      `1`。

   `callback`       ,    [`TypeError`](http://nodejs.cn/s/Z7Lqyj)


参考資料
  • https://tech.mybuilder.com/handling-retries-and-back-off-attempts-with-javascript-promises/
  • NodeJS async/await with retry
  • Retry優雅な失敗リトライポリシー
  • Automaticaally retry an async await function n times