Quarkus Reactiveプログラミング入門|UniとMultiの違いと使い方を初心者向けにやさしく解説
生徒
「QuarkusのReactiveプログラミングで、UniとかMultiって出てくるんですが、正直よく分かりません…」
先生
「Quarkusでは、非同期処理やリアクティブ処理を分かりやすく書くためにUniとMultiを使います。違いが分かると、REST APIの実装が一気に楽になりますよ。」
生徒
「同期処理と何が違うんですか?初心者でも理解できますか?」
先生
「大丈夫です。まずは考え方から、実際のJavaコードを見ながら説明していきましょう。」
1. QuarkusにおけるReactiveプログラミングとは
QuarkusのReactiveプログラミングは、Javaで非同期処理をシンプルに書くための仕組みです。 従来の同期処理では、処理が終わるまでスレッドが待ち続けますが、Reactiveプログラミングでは 処理結果が返ってきたタイミングで次の処理を実行します。
Quarkusでは、このReactiveプログラミングを実現するためにSmallRye Mutinyというライブラリを採用しています。 その中心となる概念がUniとMultiです。Quarkus、Reactive、非同期処理、ノンブロッキングといった キーワードは、REST API開発でも頻繁に登場します。
2. Uniの基本概念と特徴
Uniは「結果が一つだけ返ってくる非同期処理」を表します。 データベースから一件のデータを取得する場合や、単純な計算結果を返す場合によく使われます。 同期処理で言えば、戻り値が一つのメソッドに近いイメージです。
QuarkusのREST APIでUniを使うと、処理中にスレッドをブロックせず、 高速でスケーラブルなアプリケーションを実現できます。 初心者の方は「結果が一つならUni」と覚えると理解しやすくなります。
import io.smallrye.mutiny.Uni;
public class UniExample {
public static void main(String[] args) {
Uni<String> uni = Uni.createFrom().item("Hello Quarkus");
uni.subscribe().with(
item -> System.out.println(item)
);
}
}
Hello Quarkus
3. Multiの基本概念と特徴
Multiは「複数のデータが順番に流れてくる非同期処理」を表します。 一覧データの取得や、イベントが連続して発生する処理に向いています。 同期処理で言えば、リストや配列を順番に処理するイメージです。
QuarkusのReactiveプログラミングでは、ストリーム処理のようにデータを扱えるため、 メモリ効率が良く、リアルタイム性の高い処理が可能になります。 Kafkaなどのイベント駆動開発にもつながる重要な考え方です。
import io.smallrye.mutiny.Multi;
public class MultiExample {
public static void main(String[] args) {
Multi<Integer> multi = Multi.createFrom().items(1, 2, 3);
multi.subscribe().with(
item -> System.out.println(item)
);
}
}
1
2
3
4. UniとMultiの違いをイメージで理解する
UniとMultiの違いはとてもシンプルです。 Uniは「一回だけ結果が返る電話」、Multiは「何度も通知が届くメッセージアプリ」 のように考えると分かりやすくなります。
QuarkusのReactive REST APIでは、エンドポイントの戻り値として UniやMultiをそのまま返すことができます。 これにより、非同期処理を意識せずに、自然なJavaコードが書けるのが特徴です。
5. Uniを使った簡単なREST APIの考え方
QuarkusのREST APIでは、データ取得処理をUniで返すことで、 ノンブロッキングなAPIを簡単に実装できます。 まだデータベースを学習していなくても、考え方だけ理解しておくと後で役立ちます。
import io.smallrye.mutiny.Uni;
public class UserService {
public Uni<String> findUserName() {
return Uni.createFrom().item("Taro");
}
}
Taro
6. Multiを使った繰り返し処理の考え方
Multiは、繰り返し処理や一覧表示と相性が良いReactive型です。 for文の代わりに使うというより、「データが流れてくる」という感覚を持つことが大切です。
Quarkusでは、この仕組みによって大量データでも安定した処理が可能になります。 Reactive Streamsの考え方に自然と慣れていくことができます。
import io.smallrye.mutiny.Multi;
public class NumberService {
public Multi<Integer> getNumbers() {
return Multi.createFrom().items(10, 20, 30, 40);
}
}
10
20
30
40
7. 初心者がつまずきやすいポイントと学習のコツ
QuarkusのReactiveプログラミングで初心者がつまずきやすいのは、 「いつ処理が実行されるのか分からない」という点です。 UniやMultiは、subscribeされたタイミングで初めて処理が動きます。
まずは、同期処理との違いを意識しすぎず、 「結果が一つならUni」「複数ならMulti」という基準で使い分ける練習をすると理解が進みます。 Quarkus、Reactive、Uni、Multi、REST APIといったキーワードを意識しながら、 小さなサンプルコードを動かすのがおすすめです。