NodeJSはRetry再試行戦略と返品試行を実現します.
1904 ワード
需要の説明
サービスセンターでは常に異常なトラブルが発生しています.重要な業務に対しては、異常を捕まえて、やり直したり、返品したりします.
例えば、メールサービス.私たちが第三者のSMSサービスを呼び出した場合、ネットワークがタイムアウトしたため、APIの呼び出しに失敗し、ユーザーに認証コードを送信できなくなりました.通常、
構想を実現する
コードの実装
初版
最後に、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
サービスセンターでは常に異常なトラブルが発生しています.重要な業務に対しては、異常を捕まえて、やり直したり、返品したりします.
例えば、メールサービス.私たちが第三者の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)
参考資料