再試行メカニズム
- retry:
retry
は、コールバックベースの関数を再試行します。エラーが発生した場合に指定された回数だけ再試行します。 - promise-retry:
promise-retry
は、Promiseベースの関数を再試行します。関数が成功するまで再試行し、待機時間をカスタマイズできます。 - exponential-backoff:
exponential-backoff
は、再試行の待機時間をシンプルに指数関数的に増加させます。特定のエラーコードに基づいて再試行を制御することもできます。 - async-retry:
async-retry
は、非同期関数の再試行を行います。Promiseが拒否された場合に再試行し、成功するまで続けます。 - backoff:
backoff
は、再試行の待機時間を指数関数的に増加させることができます。これにより、再試行が繰り返されるたびに待機時間が長くなります。
待機時間のカスタマイズ
- retry:
retry
では、待機時間をカスタマイズする機能はありません。 - promise-retry:
promise-retry
では、待機時間をカスタマイズするための関数を指定できます。これにより、再試行ごとに異なる待機時間を設定できます。 - exponential-backoff:
exponential-backoff
では、待機時間の増加率をカスタマイズできますが、シンプルな設計のため、複雑なカスタマイズは難しいです。 - async-retry:
async-retry
では、待機時間をカスタマイズするための関数を指定できます。これにより、再試行の間に任意の待機時間を設定できます。 - backoff:
backoff
では、待機時間を指数関数的に増加させることができますが、カスタマイズは限られています。
エラー処理
- retry:
retry
は、エラーが発生した場合に再試行を行います。エラー処理のカスタマイズは限られています。 - promise-retry:
promise-retry
は、再試行中に発生したエラーを処理します。エラーが発生した場合に再試行を行い、成功するまで続けます。 - exponential-backoff:
exponential-backoff
は、特定のエラーコードに基づいて再試行を制御することができます。これにより、特定のエラーに対して再試行を行わないように設定できます。 - async-retry:
async-retry
は、再試行中に発生したエラーをキャッチし、再試行を続けます。すべてのエラーを処理するため、特定のエラーに対するカスタム処理は難しいです。 - backoff:
backoff
は、再試行中に発生したエラーを処理しますが、特定のエラーに基づいて再試行を制御する機能はありません。
シンプルさと使いやすさ
- retry:
retry
は、コールバックベースの関数を再試行するためのシンプルなライブラリで、使いやすいです。 - promise-retry:
promise-retry
は、Promiseベースの関数を再試行するためのシンプルなAPIを提供しています。 - exponential-backoff:
exponential-backoff
は、シンプルな設計で使いやすく、特に指数関数的再試行が必要な場合に適しています。 - async-retry:
async-retry
は、シンプルなAPIで使いやすく、非同期関数の再試行を簡単に実装できます。 - backoff:
backoff
は、再試行の待機時間を指数関数的に増加させる機能があり、使いやすいですが、カスタマイズは限られています。
Ease of Use: Code Examples
- retry:
コールバックベースの再試行
const retry = require('retry'); const operation = retry.operation({ retries: 5, // 最大再試行回数 factor: 2, // 待機時間の増加率 minTimeout: 1000, // 最小待機時間 maxTimeout: 5000, // 最大待機時間 }); operation.attempt((currentAttempt) => { console.log(`試行 ${currentAttempt}`); // 失敗する可能性のある操作 const success = false; // 成功/失敗のシミュレーション if (success) { operation.succeed(); // 成功 } else { operation.retry(new Error('失敗')); // 失敗して再試行 } });
- promise-retry:
Promiseベースの再試行
const promiseRetry = require('promise-retry'); function fetchWithRetry() { return promiseRetry((retry, number) => { console.log(`試行 ${number}`); return fetch('https://example.com').catch(retry); // エラーが発生したら再試行 }, { retries: 5, // 最大再試行回数 minTimeout: 1000, // 最小待機時間 maxTimeout: 5000, // 最大待機時間 }); });
- exponential-backoff:
シンプルな指数関数的再試行
const { exponentialBackoff } = require('exponential-backoff'); async function retryOperation() { // 失敗する可能性のある操作 } await exponentialBackoff(retryOperation, { retries: 5, // 最大再試行回数 initialDelay: 1000, // 初期待機時間 multiplier: 2, // 待機時間の増加率 });
- async-retry:
非同期関数の再試行
const retry = require('async-retry'); async function fetchData() { // 失敗する可能性のある非同期操作 } await retry(async (bail) => { const result = await fetchData(); if (!result) bail(new Error('データが取得できませんでした')); // 再試行せずにエラーを返す return result; }, { retries: 5, // 最大再試行回数 minTimeout: 1000, // 最小待機時間 maxTimeout: 5000, // 最大待機時間 });
- backoff:
指数関数的再試行
const { backoff } = require('backoff'); const operation = backoff.call(() => { // 失敗する可能性のある操作 }); operation.failAfter(5); // 最大失敗回数 operation.setStrategy(new backoff.ExponentialStrategy()); // 指数関数的戦略 operation.start();