§Akka の統合
Akka は、アクター・モデルに基づいて、これまでより高い抽象度で、並列かつスケーラブルなアプリケーションを実装するためのプラットフォームです。Akka は耐障害性を実現するために ‘Let it crash’ モデルを採用しています。これは、自己修復するアプリケーション、言い換えれば落ちないシステムを必要としていた通信業界で大きな成功を収めているモデルです。アクターは分散処理を意識せずに実現できるような抽象化を提供する一方で、スケーラブルかつ耐障害性のアプリケーションを実装するベースにもなります。
§アプリケーションのアクターシステム
Akka 2.0 は アクターシステム
と呼ばれるいくつかのコンテナを持ちます。それぞれのアクターシステムは、それに含まれるアクターを動かすためのリソースを管理します。
Play アプリケーションには、アプリケーション自身が使う特別なアクターシステムが定義されています。このアクターシステムはアプリケーションのライフサイクルに追従し、アプリケーションと共に自動的に再起動します。
Note: 独自のアクターシステムを利用しても全く問題ありません。デフォルトのアクターシステムは、実行するアクターの数が少なく、別のアクター・システムを自分で用意するまでもないような場合に利用するとよいでしょう。
アプリケーションのデフォルトのアクターシステムを利用するためには、play.api.libs.concurrent.Akka
ヘルパーを利用します。
val myActor = Akka.system.actorOf(Props[MyActor], name = "myactor")
§設定
デフォルトのアクターシステムの設定は、Play アプリケーションの設定ファイルから読み込まれます。例えば、アプリケーションのアクターシステムのデフォルトディスパッチャを変更したい場合は、 conf/application.conf
ファイルにその設定を数行追加します。
akka.default-dispatcher.fork-join-executor.pool-size-max =64
akka.actor.debug.receive = on
Note: Akka の規約に基づいて設定ファイルにトップの設定キーを記述することで、同じファイル内で全く別のアクターシステムを構成することもできます。
§Akka Future
から Play Promise
への変換
Akka アクターと非同期的にやり取りをすると、 Future
オブジェクトが返ってきます。play.api.libs.concurrent._
に用意されている implicit conversion を利用すると、この Future
を Play の Promise
オブジェクトに簡単に変換することができます。
def index = Action {
Async {
(myActor ? "hello").mapTo[String].asPromise.map { response =>
Ok(response)
}
}
}
§コードブロックを非同期的に実行する
Akka の典型的なユースケースは、Actor を特別難しい使い方をせずに、計算を並列化することです。例えば、あなたが並列計算を行うためにアクターのプールを作成しているようなら、もっと簡単(かつ高速な)方法があります。
def index = Action {
Async {
Akka.future { longComputation() }.map { result =>
Ok("Got " + result)
}
}
}
§非同期タスクのスケジューリング
Akka では、アクターへのメッセージ送信やタスク(関数または Runnable
)の実行を予約することができます。予約を行うと、結果として Cancellable
のインスタンスが返ってきます。その cancel
メソッドを呼び出すことで、予約した操作の実行をキャンセルすることができます。
例えば、testActor
に 30 分おきにメッセージを送信する場合は次のように書きます。
Akka.system.scheduler.schedule(0 seconds, 30 minutes, testActor, "tick")
Note: この例では
akka.util.duration
に定義されている implicit conversion を利用して、数値を時間単位の異なるDuration
オブジェクトへ変換しています。
同様に、コード・ブロックを今から 10 秒後に実行するには、次のように書きます。
Akka.system.scheduler.scheduleOnce(10 seconds) {
file.delete()
}
次ページ: 多言語対応
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。