こんにちは、SAKURUGのKeitaです。
今回は最近Spring WebFluxという技術に触れたのでSpring WebFluxについてご紹介できればと思います。
今回の記事では
1.Spring WebFluxの概要と特徴
2.メリット/デメリット
3.利用シナリオ
の3つをご紹介できればと思います。
具体的な実装方法などについてはSpring WebFluxについて ②コーディング編で解説予定です。
Spring WebFluxはリアクティブ・プログラミング対応のウェブフレームワークです。
従来の Spring MVC が「スレッド/ブロッキング I/O」モデルを採用していたのに対し、WebFlux はノンブロッキング I/Oを前提に設計されており、
主に Reactor(Project Reactor)が提供する「Flux」「Mono」というリアクティブ・タイプを駆使し、サーバーリソースを効率よく使いながら高並列なリクエスト処理が可能です。
視覚的に分かりやすくするために下記の図1,2を見てみましょう。
リクエストを受け取ると、サーブレットコンテナ(Tomcatなど)のスレッドプールから1スレッドを占有し、同期 I/O(JDBCなど)の完了まで待機状態となります。
そのため、もし同一スレッドプール内のすべてのスレッドが I/O 待ちに入ってしまうと、新たなリクエストはキュー待機が発生してしまいます。
図1のオレンジ部が処理中、灰色部がI/O待機中になります。処理1のI/O待機中に処理2がリクエストされていますがこの時スレッド解放されていないため、処理1が完了するまで待機してから処理2が始まっていることが分かると思います。
〇.図1
Reactor Netty 上で動作する WebFlux は、ノンブロッキング I/O(例:R2DBC、Reactive MongoDB ドライバ)を前提に設計されています。
リクエスト受信時はイベントループスレッドが極めて短時間で制御を Reactor パイプラインに渡し、I/O 待ち中はスレッドを解放。
その間に同一イベントループで別リクエストの処理が走るため、少ないスレッド数でも高い並列性を実現します。
図2を見ると図1とは違いオレンジ部のみになっていることが分かると思います。
このようにWebFluxでは少ないスレッドでより多くの処理を行え、より効率的にリソースを利用できるというメリットがあります。※1
〇図2
前述の特徴の通り、サーバーリソースを抑えながらも大量の同時接続やI/O待ちを効率的にさばくことが可能です。
次回のコーディング編で詳しく解説しますが、ReactorのMono・Fluxを使ったイベント駆動型パイプラインで、
外部APIやDBアクセスのI/O待ち時間を最小化しつつ並列処理が可能。
これにより高スループットになっています。
メリットで話したReactorに関する知識や、オペレーターの動作原理、非同期エラー処理のパターンなどの知識が必要となり、習熟にやや時間がかかります。
先述のReactorのMono・Flux型に処理を定義してオペレーターに投げるため、処理中にエラーが発生してもブレークポイントなどでデバッグができず、エラー原因を探るのが難しくなります。
リアルタイム性が求められるかつ、リクエスト数が多くなることが想定されるため。
大量のリクエストを高速に処理出来るwebFluxは、大量データを迅速に処理する能力が求められるデータ分析にも向いています。
●マイクロサービスアーキテクチャへの適用
マイクロサービスアーキテクチャでは、各サービスが独立して動作し、相互に通信する必要があります。
WebFluxは、非同期通信をサポートしているため、このサービス間の通信をより効率的に行うことが可能なため、向いていると言えます。
ここまで、お読みいただきありがとうございました。
今回はSpring Web Flux概要編ということで、web fluxの特徴やメリット、活用できるシナリオなどのご紹介をしました。
次回はコーディング編ということで、実際のコード例やコーディング時に注意すべき点などを解説しようと思っています。
今後もバックエンドをメインに記事を発信していくので、時々記事を見に来ていただけると嬉しいです。
※1.厳密にはMVC側でもasyncを使用することで似たようなことは可能ですが、それを込みにしてもweb flux側のほうが早いです。また今回は純粋なspring mvcとweb fluxの比較とします。
カジュアル面談では、会社の雰囲気や仕事内容についてざっくばらんにお話ししています。
履歴書は不要、服装自由、原則オンラインです。興味を持っていただけた方は、
ぜひ以下からお申し込みください。
皆さんにお会いできることをサクラグメンバー一同、心より楽しみにしております!
カジュアル面談応募フォーム