ScalaでのMonixを使用した非同期およびリアクティブプログラミング
1. 概要
最新の大規模アプリケーションのほとんどは本質的にリアクティブです。 このようなシステムは、イベント駆動型プログラミングパラダイムに従い、一般に非常にスケーラブルで、障害に対して回復力があります。 そのようなシステムを構築するために利用できるツールはたくさんあります。 Monix は、ScalaおよびScala.js向けのそのような製品の1つです。
この短いチュートリアルでは、このライブラリについて理解します。
2. モニックスとは何ですか?
Monixは、非同期およびイベント駆動型プログラミングを作成するために構築された高性能のScalaライブラリです。 Monixという名前は、MonadsとRxに由来しています。 これはReactiveXの実装として始まりました。したがって、はデフォルトでバックプレッシャ処理とReactiveStreamsプロトコルをサポートします。 Observable 、Taskなどの同時実行プリミティブを提供します。 Typelevel プロジェクトであるため、Catsなどの他のTypelevelライブラリと互換性があります。
Taskデータ型を使用して非同期プログラムを構築する例を見てみましょう。
def sampleMonixTask(a:Int, b:Int): Task[Int] = Task {
val result = {
a + b
}
result
}
val task = sampleMonixTask(5, 5)
タスクデータ型はデフォルトでレイジーです。 したがって、プログラムの実行を開始するには、トリガーが必要です。 runToFuture メソッドを呼び出して、結果を調べてみましょう。
val f = task.runToFuture
println(f.value) // Prints Some(Success(10))
タスクを実行する方法は他にもいくつかあります。 コールバックメソッドを受け取り、Cancelableを返すrunAsyncメソッドを見てみましょう。
val cancelable = task.runAsync { result =>
result match {
case Right(value) => println(value)
case Left(ex) => println(s"Exception: ${ex.getMessage}")
}
} // prints 10
さらに、Taskデータ型を使用することにはいくつかの利点があります。 1つは、実行をよりきめ細かく制御できることです。非同期プログラムをいつどのように実行するかを決定できます。
3. Monixサブプロジェクト
Monixプロジェクトはモジュラー設計に従いました。 その結果、それはいくつかのサブプロジェクトで構成されています。 これは、プロジェクトに必要なコンポーネントのみを選択するのに役立ちます。 それらのそれぞれを調べて、それらが何に使用されているかを見てみましょう。
3.1. monix-execution
monix-executionモジュールから始めましょう。 このモジュールは、非同期実行用の低レベルのプリミティブ型を提供します。 scala.concurrentパッケージの上に構築されています。スケジューラー、キャンセル可能、コールバックなどがあります。このモジュールの便利なメンバー。
3.2. monix-catnap
次はmonix-catnapモジュールです。 並行性を管理するための一般的で純粋に機能的な抽象化を提供します。 Cats-Effectsの上に構築されています。 CircuitBreakerおよびMVarは、このモジュールの主要コンポーネントです。
3.3. monix-eval
monix-eval モジュールは、原理的な方法で純粋に機能的な効果を処理するのに役立ちます。 TaskおよびCoevalは、副作用を制御し、並行性を効果的に処理するための主要なコンポーネントです。
3.4. monix-reactive
monix-reactive モジュールは、 ReactiveX 設計ガイドラインを使用して、Observerパターンを実装します。 Observable データ型、高性能ストリーミング抽象化を公開します。
3.5. モニックステール
最後に、 monix-tail モジュールは、プルベースのプロトコルを使用した非同期ストリーミング用のユーティリティを提供します。 非常に構成可能で柔軟なストリーミングデータ型Iterantを公開します。
4. 結論
このチュートリアルでは、Monixライブラリとそのアプリケーションを見てきました。 次に、 Task データ型を使用した例と、Scalaの標準ライブラリに対するいくつかの利点を確認しました。 その後、Monix内のサブプロジェクトのリストを見て、それぞれのコンポーネントと機能を学びました。
いつものように、記事の完全なソースコードは、GitHubでから入手できます。