webflux-reactive-patterns について
Spring WebFlux と Reactor でリアクティブサービスを開発するための実践スキルです。リクエスト処理、コンテキスト、永続化、テストを扱い、ブロッキング処理やバックプレッシャー、キャンセルへの対処を説明します。
主な機能
- 01Mono と Flux のリクエスト処理規則
- 02ブロッキング処理の分離とタイムアウト
- 03Reactor Context とエラー処理
- 04R2DBC、並行処理、バックプレッシャー
- 05StepVerifier と WebTestClient によるテスト
活用シーン
- 01ノンブロッキングな WebFlux リクエストフローの設計
- 02イベントループからのブロッキング呼び出しの分離
- 03キャンセル、タイムアウト、バックプレッシャーのテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rrezartprebreza/ spring-boot-skills --skill webflux-reactive-patternsインストール後、Claude Code で/webflux-reactive-patternsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlexamples/good-reactive-service.javabad-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を参照してください。
公式ソース
- Spring WebFlux:https://docs.spring.io/spring-framework/reference/web/webflux.html
- Reactor リファレンス:https://projectreactor.io/docs/core/release/reference/
- Spring Data R2DBC:https://docs.spring.io/spring-data/relational/reference/r2dbc.html
注意点
- エージェントが MVC と WebFlux のスターターを誤って追加する場合があります。意図した Web スタックを選択してください。
- エージェントがアプリケーションの処理フローで
block()またはsubscribe()を呼び出す場合があります。サブスクリプションはランタイムに任せてください。 - エージェントがテナントやトレースのデータに
ThreadLocalを使用する場合があります。Reactor のContextを使用してください。 - エージェントが同時実行数に上限のない
flatMapを使用する場合があります。下流の制限に基づいて同時実行数を設定してください。 - エージェントが JDBC を
Mono.justでラップする場合があります。これでもイベントループはブロックされます。
コメント
Markdown 対応