ミュータブルオブジェクトの難しさとアクターモデル
先に紹介したような現代の非同期処理ツールの多くは、プログラマにとっての使いやすさをよく考慮していて、特にイミュータブルオブジェクトを使っている限り安全かつ効率の良い処理を実現しやすくなっています。
しかし残念ながら全ての非同期処理をイミュータブルオブジェクトのみで実現できるとは限りません。アプリケーションによっては「スレッド間共有」かつ「ミュータブル」なオブジェクトを使う必要があります。
現代の非同期処理ツールが全て、イミュータブルオブジェクトだけでなくミュータブルオブジェクトも扱いやすくしてくれるわけではありません。それらのツールのうちいくつかは、ミュータブルオブジェクトを扱う際に低レイヤーに属するスレッドやロックといった非同期処理機構と組み合わせることを必要とします。
厄介なことに、現代のリッチな動作とリアルタイムな応答を主とするアプリケーションでは、往々にしてミュータブルな状態がアプリケーションのさまざまな場所に存在し、それらを非同期処理が走る環境の中で正しく管理する必要があります。
Akkaはこれらの助けになる可能性があります。AkkaはJavaとScalaから利用できる非同期・分散処理システムを作るためのツールキットであり、耐障害性のあるアプリケーションを作ることができます。Akkaのアクターモデル実装を使えば「スレッド間共有」かつ「ミュータブル」なオブジェクトの管理を、低レベルな非同期処理機構を意識することなく、かつパフォーマンスを犠牲にすることなく実現することができます。
AkkaはLightbend社とオープンソース・コミュニティが協力して開発しています。Lightbend社はScala言語の開発を支援している企業で、共同創業者の中にはScala言語の作成者であるMartin Odersky教授と、Akkaの作成者でありLightbend社CTOのJonas Bonér氏がいます。Akkaの利用例は特に海外で多く、PayPalなどの金融サービスやIoTサービス、あるいは自転車のライドシェアサービスなど大規模なトラフィックを捌く能力と高い安定性が要求される分野でも活用されています。日本でもChatwork社がチャットアプリケーションのバックエンドにAkkaを採用し、TIS社がAkkaを中心としたリアクティブ技術のコンサルティング・サービスや研究開発などを行っています。
本連載ではアクターモデルによって得られる恩恵と仕組みを紹介します。他の言語やツールでも応用できるようにコンセプトや設計パターンに比重をおいて説明します。
マイクロサービスと分散システムへの展開
非同期処理で使うためのアクターモデル実装として始まったAkkaですが、実は比較的初期からクラスタリングの機能を提供していて、水平方向のスケールアウトを可能にしていました。つまりクラスターに参加するマシンの数を増やすことによってクラスター全体の処理能力を向上させるアプローチです。近年のAkkaの開発はアクターモデルのみにとどまらず、Akkaを使ったマイクロサービスの実現、そしてマイクロサービスを実現する上で避けられない分散システムに関わる諸問題の解決策を提供する方向で進められています。最近ではKubernetes上でAkkaを動かすためのService Discovery機能が提供されるなどクラウド・ネイティブな開発トレンドへの対応も見られます。
こういった方向性の先にAkkaが見据えているのは、データ志向なアプリケーション開発への対応です。現代のシステムの一部ではいわゆるデータ志向と呼ばれ、大量のデータがシステム内を流れ、かつデータの分析をもとにリアルタイムにユーザーへ応答を返すことが求められるといわれています。こういったシステムでは大量のデータを高速に処理するための水平方向へのスケーリング、大規模システムの開発スピードを保つためのマイクロサービス化などのアプローチが採用されることが多く、Kubernetesを始めとするクラウド・ネイティブ技術の一群の利用が選択肢となるでしょう。
Lightbend社ではリアルタイムな応答を実現するするため「ステートフル・マイクロサービス」という概念を提唱していて、Akkaを中心としたアプリケーションをKubernetesなどのクラウド・ネイティブ技術の上で動かす取り組みを行っています。通常アプリケーションのサービスはステートレスに作ることで運用を楽にすることが多いのですが、リアルタイム応答性を上げるため敢えてステートフルなアプリケーションを作るというのはおもしろいアプローチだと思います。このステートフル・マイクロサービスの鍵となるのはAkkaのアクターモデル実装です。
そしてLightbend社は2019年の8月にCloudStateという新たなオープン・ソースプロジェクトを立ち上げました。これはクラウド・ネイティブ技術の中でも特に注目度の高いサーバーレス技術とステートフル・マイクロサービス技術の組み合わせを推進していくものです。
本連載の後半ではこういった現在注目を浴びるクラウド・ネイティブ技術とAkkaがどう関わっていくのか、どう組み合わせることできるのかも紹介したいと思います。データ志向・マイクロサービス設計の開発を行う際に参考になると思いますし、それらが分散システム上の諸問題にどういったアプローチで解決を試みているのかも紹介できればと思います。