SAKURUG TECHBLOG

Spring WebFluxについて ①_概要編

timestampauthor-name
Keita

はじめに

こんにちは、SAKURUGのKeitaです。
今回は最近Spring WebFluxという技術に触れたのでSpring WebFluxについてご紹介できればと思います。

本記事で話す内容

今回の記事では

1.Spring WebFluxの概要と特徴

2.メリット/デメリット

3.利用シナリオ

の3つをご紹介できればと思います。
具体的な実装方法などについてはSpring WebFluxについて ②コーディング編で解説予定です。

Spring WebFluxについて

1.Spring WebFluxの概要と特徴

●従来のspring MVCとの違い

Spring WebFluxはリアクティブ・プログラミング対応のウェブフレームワークです。
従来の Spring MVC が「スレッド/ブロッキング I/O」モデルを採用していたのに対し、WebFlux はノンブロッキング I/Oを前提に設計されており、
主に Reactor(Project Reactor)が提供する「Flux」「Mono」というリアクティブ・タイプを駆使し、サーバーリソースを効率よく使いながら高並列なリクエスト処理が可能です。
視覚的に分かりやすくするために下記の図1,2を見てみましょう。

・従来のmvc

リクエストを受け取ると、サーブレットコンテナ(Tomcatなど)のスレッドプールから1スレッドを占有し、同期 I/O(JDBCなど)の完了まで待機状態となります。
そのため、もし同一スレッドプール内のすべてのスレッドが I/O 待ちに入ってしまうと、新たなリクエストはキュー待機が発生してしまいます。
図1のオレンジ部が処理中、灰色部がI/O待機中になります。処理1のI/O待機中に処理2がリクエストされていますがこの時スレッド解放されていないため、処理1が完了するまで待機してから処理2が始まっていることが分かると思います。

〇.図1

・web flux

Reactor Netty 上で動作する WebFlux は、ノンブロッキング I/O(例:R2DBC、Reactive MongoDB ドライバ)を前提に設計されています。
リクエスト受信時はイベントループスレッドが極めて短時間で制御を Reactor パイプラインに渡し、I/O 待ち中はスレッドを解放。
その間に同一イベントループで別リクエストの処理が走るため、少ないスレッド数でも高い並列性を実現します。
図2を見ると図1とは違いオレンジ部のみになっていることが分かると思います。
このようにWebFluxでは少ないスレッドでより多くの処理を行え、より効率的にリソースを利用できるというメリットがあります。※1

〇図2

2.Spring WebFluxのメリット・デメリット

●メリット

・非同期・ノンブロッキングI/O

前述の特徴の通り、サーバーリソースを抑えながらも大量の同時接続やI/O待ちを効率的にさばくことが可能です。

・高スループット・リアクティブストリーム対応

次回のコーディング編で詳しく解説しますが、ReactorのMono・Fluxを使ったイベント駆動型パイプラインで、
外部APIやDBアクセスのI/O待ち時間を最小化しつつ並列処理が可能。
これにより高スループットになっています。

●デメリット

・学習コストが高い

メリットで話したReactorに関する知識や、オペレーターの動作原理、非同期エラー処理のパターンなどの知識が必要となり、習熟にやや時間がかかります。

・デバッグが難しい

先述のReactorのMono・Flux型に処理を定義してオペレーターに投げるため、処理中にエラーが発生してもブレークポイントなどでデバッグができず、エラー原因を探るのが難しくなります。

3.利用シナリオ

●チャットツール

リアルタイム性が求められるかつ、リクエスト数が多くなることが想定されるため。

大規模データ処理・分析システム

大量のリクエストを高速に処理出来るwebFluxは、大量データを迅速に処理する能力が求められるデータ分析にも向いています。

マイクロサービスアーキテクチャへの適用

マイクロサービスアーキテクチャでは、各サービスが独立して動作し、相互に通信する必要があります。
WebFluxは、非同期通信をサポートしているため、このサービス間の通信をより効率的に行うことが可能なため、向いていると言えます。

終わりに

ここまで、お読みいただきありがとうございました。
今回はSpring Web Flux概要編ということで、web fluxの特徴やメリット、活用できるシナリオなどのご紹介をしました。
次回はコーディング編ということで、実際のコード例やコーディング時に注意すべき点などを解説しようと思っています。

今後もバックエンドをメインに記事を発信していくので、時々記事を見に来ていただけると嬉しいです。

※1.厳密にはMVC側でもasyncを使用することで似たようなことは可能ですが、それを込みにしてもweb flux側のほうが早いです。また今回は純粋なspring mvcとweb fluxの比較とします。

▼高校生向けインターン実施中!

弊社では高校生向けにインターンを行っております!
現役エンジニア指導の下、一緒に働いてみませんか?

高校生インターン応募フォーム

▼カジュアル面談実施中!

カジュアル面談では、会社の雰囲気や仕事内容についてざっくばらんにお話ししています。
履歴書は不要、服装自由、原則オンラインです。興味を持っていただけた方は、
ぜひ以下からお申し込みください。

皆さんにお会いできることをサクラグメンバー一同、心より楽しみにしております!

カジュアル面談応募フォーム

記事をシェアする

ABOUT ME

author-image
Keita
準備中です