Akkaで始める並行処理(1) - アクターモデルとAkkaの概要
概要
近年、コンピュータの CPU はマルチコアが当たり前になった。マルチコアを使うにはマルチスレッドプログラムを扱う必要がある。
また、アプリケーションでは Web サービスなど複数のネットワーク通信を使用することが多くなっている。通常ネットワーク通信は同期処理で行われる。複数のネットワーク通信を同期処理で行うと、通信結果の待ち時間が増えるため処理時間が延びてしまう。処理時間を短縮するためには、通信の非同期化や並列化が必要となる。
マルチコアを使いこなし、かつ複雑なアプリケーションを構築するためには、並行処理を簡単かつ効率的に記述する必要がある。
この連載では、アクターモデルによる並行処理ライブラリ Akka を通して、並行処理を実現する方法を紹介する。
今回はアクターモデルと Akka の概要について述べる。
アクターモデルとは
並列処理を効率的に実現する方法のひとつにアクターモデルがある。
アクターモデルとは、1973年にカール・ヒューイット氏が発表した並行処理を行うための計算モデルである。 マルチコアのコンピュータが高速ネットワークで接続する時代を想定して考案されたもののため、現在に合致している。
アクターモデルでは、アクターと呼ばれるオブジェクト同士が並列でメッセージを送受信しあって処理を実現する。 アクターは、オブジェクト指向プログラムにおけるオブジェクトのように、アクターモデルの主役となるものだ。
1つ1つのアクターは、メッセージを受信するための専用のメールボックスを持っている。
メールボックスにメッセージを受信すると、メッセージの内容に応じた処理を行うことができる。
その処理の中では、他のアクターに向けてメッセージを送信することができる。
イメージを以下に示す。
アクターモデルの特徴は、上記の機能を全て非同期で処理することにある。 アクター同士はメッセージを通してのみ結合するため、疎結合であり独立性が高くなる。 また、アクターが持つ状態は自分からしか参照できないため、ロックをする必要がない。
そのため、アクターモデルによる並行処理を利用すると、排他制御をプログラマが意識する必要が無くなる。
Akka の概要
Akka は、 JVM のマルチスレッド上でアクターモデルを実現する、OSS の並行処理ライブラリである。開発言語として、Java と Scala 向けの2つが使用できる。
2011年にバージョン1.0が公開され、現在は Lightbend 社(旧 Typesafe 社)主導でメンテナンスを行っている。 Lightbend 社は、Scala 考案者の Martin Odersky が創始者で、Play Framework など Scala や Java の著名なライブラリを開発している企業である。
特徴として、大きくプログラムを変えることなくスケールアップ・スケールアウトのいずれも実現できることが挙げられる。
従来の方法では、スケールアップをする場合はプログラムをマルチスレッド化する必要があり、スケールアウトをする場合はリモートマシンに対して RPC などの手段でネットワーク通信を行う必要があった。 一方、Akka はマルチスレッドの制御とネットワーク通信の両方を隠蔽し、設定に応じて両者を切り替えることができる。
Akka の主要な機能は以下の通りだ。
耐障害性
アクターを監視し、異常終了した場合の対処を柔軟に設定できる。位置透過性
複数のサーバーや JVM にまたがってアクターを配置できる。 メッセージを送信するアクターが同じ JVM にいるか、異なる JVM にいるかを意識する必要が無く、同じプログラミングで実現できる。 また、複数サーバーへのアクターの配置も設定ファイルの修正のみで対応できる。クラスタ・冗長化
同一の仕事をするアクターをグループ化し、複数の JVM 上で扱うことができる。 これにより、処理性能の向上を図ることができる。永続性
アクターがメモリに持つ状態を、データベースなどに保存することができる。 これにより、障害の回復やアプリケーションの再起動時に、状態の復元ができる。拡張ライブラリ
単体テストツールや、イベントバス、Akka をベースにした HTTP ライブラリや、リアクティブストリーム実装など、多数の拡張ライブラリが提供されている。
まとめ
今回は、アクターモデルと Akka の概要を紹介した。
次回以降、 Akka が備える機能について、サンプルコードを示しながら、一つずつ紹介していく。 サンプルコードは、アクターモデルとの相性が良い Scala を中心に紹介する予定だ。 Scala 固有の文法や機能については、都度解説するので Scala に詳しくない方も安心してほしい。
次回は、アクターを用いた基本的なプログラムを紹介する。
[前多 賢太郎]