riverpod-retry について
riverpod-retryは、RiverpodのProvider再試行動作とカスタマイズ方法を説明します。開発者はProvider単位または全体にポリシーを設定し、特定のエラーで再試行を止められます。
主な機能
- 01デフォルトの指数バックオフ
- 02再試行関数のカスタマイズ
- 03Providerごとの設定
- 04全体への再試行設定
- 05nullで再試行を停止
活用シーン
- 01一時的な障害後にProviderを再試行
- 02Providerごとに異なるポリシーを設定
- 03ProviderScopeで共通ポリシーを適用
- 04特定のエラーで再試行を停止
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-retryインストール後、Claude Code で/riverpod-retryを入力して読み込まれたか確認します。
詳細
Riverpod — 自動リトライ
手順
Riverpod は、計算処理で例外がスローされるとプロバイダーをリトライします。リトライはプロバイダーごと、またはグローバルにカスタマイズできます。
デフォルトの動作
デフォルトでは、プロバイダーは指数バックオフ(例:200ms から 6.4s)を使用して、上限回数(例:10 回)までリトライされます。Error と ProviderException はリトライされません。Error はバグを示し、ProviderException は依存関係の失敗を意味するため、依存するプロバイダーはリトライされず、基となるプロバイダーがリトライされます。
カスタムリトライ関数
リトライ関数のシグネチャは Duration? Function(int retryCount, Object error) です。次のリトライまでの遅延として Duration を返すか、リトライを停止する場合は null を返します。
Duration? myRetry(int retryCount, Object error) {
if (retryCount >= 5) return null;
if (error is ProviderException) return null;
return Duration(milliseconds: 200 * (1 << retryCount));
}
設定場所
- プロバイダーごと: プロバイダーの定義時に
retry: myRetryを渡します(コード生成を使用する場合は@Riverpod(retry: myRetry)を指定します)。 - グローバル: ProviderScope または ProviderContainer に
retry: myRetryを渡します。
// Global
ProviderScope(retry: myRetry, child: MyApp())
// Per provider (manual)
final myProvider = Provider<int>(retry: myRetry, (ref) => 0);
リトライの無効化
常に null を返します。
ProviderScope(retry: (retryCount, error) => null, child: MyApp())
リトライ付きの非同期プロバイダーを待機する
ref.watch(myProvider.future)(または同等の処理)は、すべてのリトライが終了するか、プロバイダーが成功するまで待機し続けます。そのため、await ref.watch(myProvider.future) は途中の失敗をスキップし、最終的にプロバイダーが成功するか、リトライを断念したときに完了します。
コメント
Markdown 対応