mcpField
W
webflux-reactive-patterns

webflux-reactive-patterns

github.com/rrezartprebreza開発32842 回インストール6 日前に更新
リポジトリ

webflux-reactive-patterns について

Spring WebFlux と Reactor でリアクティブサービスを開発するための実践スキルです。リクエスト処理、コンテキスト、永続化、テストを扱い、ブロッキング処理やバックプレッシャー、キャンセルへの対処を説明します。

主な機能

  1. 01Mono と Flux のリクエスト処理規則
  2. 02ブロッキング処理の分離とタイムアウト
  3. 03Reactor Context とエラー処理
  4. 04R2DBC、並行処理、バックプレッシャー
  5. 05StepVerifier と WebTestClient によるテスト

活用シーン

  1. 01ノンブロッキングな WebFlux リクエストフローの設計
  2. 02イベントループからのブロッキング呼び出しの分離
  3. 03キャンセル、タイムアウト、バックプレッシャーのテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/rrezartprebreza/spring-boot-skills --skill webflux-reactive-patterns

インストール後、Claude Code で/webflux-reactive-patternsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
examples/
good-reactive-service.java
bad-reactive-service.java

詳細

WebFlux のリアクティブパターン

リクエスト経路全体でノンブロッキング I/O のメリットが得られる場合は、WebFlux を使用します。

依存関係とパイプラインのルール

  • 専用の Boot 4 WebFlux および WebFlux テストスターターを使用します。
  • Mono または Flux を返します。リクエスト処理コードで subscribe() を呼び出してはいけません。
  • 順序要件に応じて、flatMap、concatMap、または逐次合成を選択します。
  • JDBC、ファイルシステム、ブロッキングを伴う SDK 呼び出しを Reactor のイベントループ上で実行しないでください。
  • 避けられないブロッキング処理は、アダプターの境界で boundedElastic に分離します。
  • 外部呼び出しにタイムアウトを設定し、キャンセルを保持します。

コンテキストとエラー

  • リクエストスコープのメタデータは ThreadLocal ではなく Reactor の Context に格納します。
  • オブザーバビリティのコンテキスト伝播を意図的に設定します。
  • キャンセルを握りつぶさず、ドメインエラーを一元的に変換します。
  • onErrorResume は明確に定義されたフォールバックにのみ使用し、onErrorContinue は避けます。

永続化とストリーミング

  • リアクティブなデータベースアクセスには R2DBC を使用します。
  • 下流の処理能力に応じて、ファンアウトの同時実行数を制限します。
  • バックプレッシャー、バッファリング、最大メモリ内サイズを定義します。
  • 下流のコードを簡潔にするためだけに、無制限のストリームをすべて収集してはいけません。

テスト

  • パブリッシャーの動作には StepVerifier を、コントラクトのテストには WebTestClient を使用します。
  • キャンセル、タイムアウト、結果なし、エラー、順序、バックプレッシャーをテストします。
  • 実用的な場合は、テストでブロッキング呼び出しを検出します。

例

  • examples/good-reactive-service.java と examples/bad-reactive-service.java を参照してください。

公式ソース

注意点

  • エージェントが MVC と WebFlux のスターターを誤って追加する場合があります。意図した Web スタックを選択してください。
  • エージェントがアプリケーションの処理フローで block() または subscribe() を呼び出す場合があります。サブスクリプションはランタイムに任せてください。
  • エージェントがテナントやトレースのデータに ThreadLocal を使用する場合があります。Reactor の Context を使用してください。
  • エージェントが同時実行数に上限のない flatMap を使用する場合があります。下流の制限に基づいて同時実行数を設定してください。
  • エージェントが JDBC を Mono.just でラップする場合があります。これでもイベントループはブロックされます。

コメント