開発・プログラミング・バックエンド
サーバーを増やす代わりに構造を変えます スレッドが止まらない Reactiveプログラミング
この講座は、Reactiveを「非同期」という単語一つで終わらせず、同じリソースでより多くのリクエストを処理する構造として扱う実習講座です。秒間20,000件以上のリクエストを、スレッドを増やさずに受け止める構造を目指します。リアクティブストリームとBack Pressureから始まり、ReactorのMonoとFluxを直接使い、Spring WebFluxベースの実務パターンまで繋げます。
難易度 入門
実習中心
Java 17 · Spring Boot
受講期間無制限
Thread per Request → イベントループ 構造自体を変える観点
概念から実務パターンまで ほぼすべての時間が実習へと続きます
Mono · Flux · Back Pressure 概念ではなくコードで確認
ネイバー現職10年目のサーバー開発者 が共に構成したカリキュラム 難易度は入門ですが、5・6セクションの実務パターンはすでにWebFluxを使っている方にとっても新しい内容です 実習環境はmacOS(Apple M3) ・ Java 17 ・ Docker
Spring WebFlux · ノンブロッキング・リアクティブ Web フレームワーク リアクティブストリーム仕様 OOMを防ぐBack Pressure Spring MVC vs WebFlux 構造の違い Reactor · Springチームが作成した実装体0〜1個を発行するMono 0個以上を発行するFlux イベントループ ベースの処理少ないスレッドで高い並行性 並列処理 · 外部API呼び出しのボトルネック解消Java 17 · Spring · Spring Boot
Spring WebFlux · ノンブロッキング・リアクティブ Web フレームワーク リアクティブストリーム仕様 OOMを防ぐBack Pressure Spring MVC vs WebFlux 構造の違い Reactor · Springチームが作成した実装体0〜1個を発行するMono 0個以上を発行するFlux イベントループ ベースの処理少ないスレッドで高い並行性 並列処理 · 外部API呼び出しのボトルネック解消Java 17 · Spring · Spring Boot
この講義が始まった理由
スレッドがすべて塞がってしまうという嘆きから始まりました
以下は実際の会話の内容です。トラフィックがパンクしているというTossの開発者と、一部のサービスをWebFluxに転換してみたNAVERの開発者の会話です。
Toss開発者 最近トラフィックがパンクし続けてる… CPUは大丈夫なんだけど、スレッドが耐えきれなくて全部詰まっちゃってるよ(泣)
Hong Tossはどんな構造を使ってるの?Thread per Request構造で処理してるの?
Toss 開発者 うん… 大部分がMVCベースだから、外部API呼び出しが増えるとブロッキング区間のせいでボトルネックが発生するんだ。インフラを増やしても根本的な解決にならない感じだよ。
Ande (Naver) 私はそれで、実はそれが少し苦手なんです。一長一短がはっきりしてはいますが… スループットの観点ではリアクティブには及ばないと思っているので。もちろん学習曲線は少しありますが(涙)
Ande (Naver) なので、私は一部のサービスをWebFluxベースのReactive構造に転換しました。全部ではなく一部だけをノンブロッキングに変えたのですが、同じリソースでもスループットがしっかりついてきましたよ
Ande (Naver) MonoやFluxを知っているだけですべて解決するわけではありませんよね。イベントループ、バックプレッシャー(Back Pressure)、ブロッキングコードの混用などは考慮すべきではないかと思います
Hong あ… 変なことになっちゃったな(笑) これを意図したわけじゃないのに;;
Toss 開発者 私は大歓迎です(笑)超おすすめ!!!私も一度受講してみますね
そうしてこの講義が作られました。実際に移行を経験した人が「これくらいは知っておくべきだ」と指摘した内容が、そのままカリキュラムになりました。
“
スループットの観点ではリアクティブには及びません。
現職のネイバー本社サーバー開発者 10年目 · 一部のサービスをWebFluxへ直接転換
今、直面していること
バックエンド開発者は同期方式さえできれば十分でしょうか
伝統的なSpring MVCベースでうまく回っているなら幸いです。しかし、トラフィックが増え始めると、次のようなことが順番に起こります。
外部APIの呼び出しが増えるにつれて、レスポンスが徐々に遅くなる
CPUは余裕があるのに、スレッドプールがすぐに枯渇する
トラフィックは増えているが、インフラ費用も一緒に上がっていく
非同期に変えようとすると、コードがどんどん複雑になる
サーバーを増やして耐えることと、同じリソースでより多くのリクエストを受けることは別の話です。
Why Spring WebFlux
Spring WebFluxは何が違うのですか
Spring WebFluxは、ノンブロッキングベースのリアクティブWebフレームワークです。伝統的なSpring MVCがリクエストごとにスレッドを割り当てるThread per Requestモデルであるのに対し、WebFluxはイベントループベースの構造で動作します。JavaとSpring Boot上でそのまま使用することができます。
Non-Blocking I/O WebFlux는 요청을 처리하는 동안 스레드를 붙잡지 않아, 적은 스레드로도 높은 동시성을 감당합니다.
バックプレッシャー WebFlux는 리액티브 스트림 표준을 따라, 데이터를 만드는 쪽과 쓰는 쪽의 속도를 맞춰 과부하를 막습니다.
イベントループ WebFlux는 요청마다 스레드를 배정하지 않고 이벤트 루프로 처리해, 동시 요청이 많은 환경에서 유리합니다.
高並列処理 (High Concurrency) WebFlux는 외부 API 호출이나 DB I/O처럼 기다리는 시간이 긴 작업에서 스레드를 막지 않아 고트래픽에 강합니다.
Mono · Flux Reactor의 Mono는 0~1개, Flux는 0개 이상의 데이터를 발행하는 타입입니다. 병렬 처리의 출발점이 이 둘입니다.
関数型 WebFlux는 Spring MVC와 비슷한 애노테이션 방식은 물론, RouterFunction을 활용한 함수형 구성도 지원합니다.
公式ドキュメントでは、Spring WebFluxをこのように説明しています。
リアクティブスタックのウェブフレームワークであるSpring WebFluxは、後のバージョン5.0で追加されました。完全にノンブロッキングで動作し、Reactive Streamsのバックプレッシャーをサポートしており、Nettyやサーブレットコンテナなどのサーバー上で動作します。
リアクティブスタックのウェブフレームワークであるSpring WebFluxは、バージョン5.0で追加されました。完全にノンブロッキングで動作し、リアクティブストリームのBack Pressureをサポートしており、Nettyのようなサーバーはもちろん、従来のサーブレットコンテナ上でも動作します。spring-webmvcとspring-webfluxはSpring Framework内で共存しており、必要に応じて併用することも可能です。
採用市場の現実
実際の公告は何を要求していますか
サーバー開発者の採用公告をそのまま持ってきました。大容量トラフィックと非同期・ノンブロッキング処理の経験が要件に含まれています。
トス サーバー開発者 JD
Toss Payments サーバー開発者 JD
ダウ・キウム系列会社 サーバー開発者 JD
ヘクトグループ サーバー開発者 JD
この講義の特徴
なぜこのReactiveプログラミング講座なのですか
ネイバーのプラットフォーム環境での転換経験に基づいています
WebFluxの文法を羅列する講義ではありません。大規模なトラフィックと外部APIへの依存度が高い環境で、どのような問題に直面し、なぜReactive構造を選んだのか、その背景から説明します。
ほぼすべての時間が実習で構成されています
Reactiveは理論だけではピンときません。MonoとFluxの動作フロー、ノンブロッキング処理方式、イベントループ構造を直接コードで確認してこそ、理解が深まります。
MVCとの構造的な違いで説明します
"非同期"という言葉一つでは不十分です。Thread per Requestモデルの限界、ブロッキング区間が作るボトルネック、ノンブロッキングアーキテクチャの動作方式を並べて比較します。
ジュニアには広い視野を、シニアには選択の基準を
WebFluxは流行の技術ではなく、高並列環境における選択肢の一つです。いつ選ぶべきか、そしていつ選ぶべきではないのかまで扱います。
受講後に変わること
この講義を終えると何ができるようになりますか?
以下の5つは、講義を終えた後にコードで実装できる、あるいは面接で根拠を持って説明できるようになる内容です。
判断 지금 겪는 병목이 스레드 대기 때문인지 CPU 때문인지 구분하고, WebFlux가 답인 상황인지 아닌지 고를 수 있습니다.
実装 Mono와 Flux로 단건·다건 흐름을 표현하고, 연산자를 조합해 여러 외부 호출을 병렬로 묶을 수 있습니다.
フロー制御 생산 속도가 소비 속도를 앞지를 때 Back Pressure로 조절해 메모리가 터지는 상황을 막을 수 있습니다.
リスク回避 리액티브 체인 안에 블로킹 코드가 섞였을 때 왜 위험한지 설명하고, 그 지점을 찾아낼 수 있습니다.
転換 기존 MVC 프로젝트 전체를 갈아엎지 않고 필요한 구간만 논블로킹으로 바꾸는 방식을 설계할 수 있습니다.
このような方におすすめです
このReactiveプログラミング講座は、どのような方のための講座ですか?
トラフィックが増えるほどスレッドプールの枯渇が不安なバックエンド開発者
MVC構造の限界を感じているが、代替案を見つけられずにいるSpring開発者
Reactiveを導入したいが、概念が漠然としていて試すことすらできていない開発者
インフラの拡張だけで問題を解決しようとして、コスト負担が大きくなっているチームの開発者
MSA環境でサービス間の通信遅延に悩むプラットフォーム開発者
高並列環境の設計経験が不足しており、キャリアの成長に渇望を感じている開発者
逆に、Back Pressureがどこで動作するのか、ブロッキングコードを混ぜるとなくなぜ危険なのか、MVCとWebFluxのどちらを選ぶべきかを今すぐ説明できるのであれば、この講義は必要ありません。
カリキュラム
Reactiveプログラミング講義カリキュラム
リアクティブを初めて学ぶ開発者のための順序で構成されています。概念とスペックから始まり、Reactorの基礎、オペレーター、実務パターン、Spring Bootベースの活用へと続きます。
セクション 1. 講義紹介
講義紹介
Spring Reactive & Spring WebFlux
セクション 2. リアクティブプログラミングのすべて
リアクティブプログラミングとは一体何なのか
Javaエコシステムで標準化して使用されるリアクティブストリームのスペック
データストリーム構造におけるOOM防止のための背圧(Back Pressure)効果
Spring MVCとSpring WebFluxの違いと注意事項
セクション 3. WebFlux Reactor 使用のための基礎
Spring Frameworkチームが作成したReactorの紹介と実習
0〜1個のデータを発行するReactor Monoの基本および核心的な使い方
0個以上のデータを発行するFluxなど、残りの基礎
セクション 4. WebFlux Reactorの多様な演算子
データを変換、結合、フィルタリングする演算子を実習で扱います。
セクション 5. WebFluxにおけるオプショナルな実務パターン
セクション 6. Spring BootベースのWebFlux活用パターン
Spring Boot上でWebFluxを実際に構成するパターンで締めくくります。
扱う技術・実習環境
何で実習しますか
webflux
Reactor
Mono · Flux
バックプレッシャー (Back Pressure)
リアクティブストリーム
イベントループ
並列処理
Java
Spring
Spring Boot
Docker
macOS (Apple M3)
Apple M3 Air環境でJava 17.0.12 LTSを使用して進行し、必要な場合はDocker(28.0.0)で周辺環境を構築します。
誰が作ったのですか
現役のサーバー開発者が共に作りました
この講義は、板橋(パンギョ)のプラットフォームサーバー開発者Hongと、NAVER本社10年目のサーバー開発者であるAndeが共同で制作しました。
知識共有者 ・ 板橋(パンギョ)プラットフォームサーバー開発
Hong
板橋(パンギョ)でプラットフォームサーバー開発を担当しています。自ら学んだ方法や実務で直面する問題・解決策を共有するために、知識共有者としての活動を続けています。講義は一人ではなく、現役の様々な開発者と共に制作しています。
[現] 板橋(パンギョ)プラットフォームサーバー開発者
Inflearn知識共有者・バックエンド講義を多数運営
[前] ブロックチェーン・メタバース バックエンド開発
ネイバー ・ 10年目のサーバー開発者
Ande
10年目のバックエンドサーバー開発者です。自分が持っている技術やスタックを他の方々と共有したいと思い、講義を制作することにしました。私が経験した失敗を、他の方々には繰り返してほしくないという思いがあります。カカオの面接官からの推薦で合流し、Hongさんの主導のもとで一緒に撮影を行いました。質問も気軽にお寄せいただければ、可能な限り確認して回答いたします。
[現] LINEヤフー(NAVER)本社サーバー開発者
[前] 新世界グループ所属のバックエンドエンジニア
[前] ヘルスケアスタートアップ サーバー開発者
[前] ソウル4年制大学 コンピュータ工学専攻
よくある質問
Reactive プログラミング講座 よくある質問
リアクティブプログラミングとは何ですか?
データを流れ(ストリーム)として捉え、その流れが押し寄せてきたときにスレッドを占有せずに処理する方式です。Javaのエコシステムにはリアクティブストリームという標準規格があり、Spring陣営の実装体がReactor、その上に載っているウェブフレームワークがSpring WebFluxです。セクション2で概念とスペックをまず整理します。
リアクティブプログラミングは非同期プログラミングと同じものですか?
同じではありません。非同期は結果を待たずに他の作業を進めるという広い概念であり、リアクティブプログラミングはその非同期の流れをデータストリームとして扱いながら、消費速度に合わせて生産速度まで調節するプログラミングモデルです。この講義が"非同期"という言葉だけでは不十分だと言っている理由が、まさにこのBack Pressureの部分です。
Spring MVCとSpring WebFluxは何が違うのですか?
MVCはリクエスト一つにスレッド一つを割り当てるThread per Requestモデルであるため、外部API呼び出しのように待ち時間が長くなるとスレッドが拘束され、ボトルネックが発生します。WebFluxはイベントループベースのノンブロッキングであるため、待機中もスレッドを解放します。セクション2の最後の講義で、その違いと注意点を併せて扱います。
MonoとFluxはそれぞれ何ですか?
どちらもReactorが提供するデータ発行タイプです。Monoは0個または1個を発行し、Fluxは0個以上を発行します。単件照会はMono、リストやストリームはFluxで表現します。セクション3でそれぞれの基本と核心的な使い方を実習で扱います。
Back Pressure(背圧)はなぜ必要なのですか?
データを生成する側が消費する側よりも速いと、処理されないデータがメモリに蓄積され、OOM(Out Of Memory)につながる可能性があります。Back Pressureは、消費者が処理できる分だけを要求するように流れを調節する仕組みです。セクション2でOOM防止の観点から扱います。
WebFluxを使えば、必ず速くなりますか?
いいえ。WebFluxが強みを発揮するのは、外部API呼び出しやI/O待ちが多く、スレッドが拘束されるような状況です。CPUを長時間使用する演算がボトルネックである場合、構造を変えても大きな変化はなく、途中にブロッキングコードが混ざるとむしろ損になります。この講義では、その判断基準まで含めて扱います。
既存のMVCプロジェクト全体をWebFluxに変える必要がありますか?
すべてを変える必要はありません。spring-webmvcとspring-webfluxはSpring Frameworkの中で共存しており、必要なサービスだけをノンブロッキングに転換することも可能です。実際に講師も、一部のサービスだけを転換して同じリソースでスループットを向上させた経験をこの講義に盛り込みました。
Reactive入門者でもついていけますか?
はい。入門レベルの講義として、リアクティブとは何かという点とストリーム仕様から始まり、Reactorの基礎、演算子、実務パターンの順に進んでいきます。JavaとSpring Bootの使用経験があれば十分ですし、後半の実務パターンはすでにWebFluxを使っている方にとっても新しい内容となっています。
実習環境はどのように構成しますか?
Apple M3 AirでJava 17.0.12 LTSを使用して進行し、必要な場合はDocker 28.0.0で周辺環境を構築します。別途の有料クラウド決済なしで、ローカルですべて実習可能です。
Reactiveプログラミング講義のカリキュラムはどのような順序ですか?
リアクティブの概念とリアクティブストリームの仕様、Back Pressure、MVCとの違いから始まり、Reactorの基礎(Mono・Flux)、多様な演算子、実務パターン、Spring BootベースのWebFlux活用の順で続きます。受講期限は無制限です。
スレッドを増やす代わりに、流れを設計します
リアクティブとは何かから始まり、Mono・Fluxや実務パターンまで、すべて実習で確認します。
강의 시작하기