今日、Akka 1.0にいくつかの改善が加わったAkka 1.1がリリースされた。また、Scala 2.9(Akka 1.1 requires Scala 2.9)も今日リリースされた。両方とも現在はMartin Odersky氏とJonas Bonér氏の新しい会社Typesafeが管理している。同社はAkkaとScalaのトレーニングを提供すると同時にこの2つの技術を使った商用製品を提供している。integrated stackは同社の製品だ。
Akka 1.1 (akka-actor
)はScala 2.9に依存しない。他の変更に加えて、Future
たくさんの作業がに対してたくさんの改善がなされた。発表によると、
- 限定継続を使ったFuture向けのデータフローAPI。これを使えば、実際はブロックしないが、見かけ上はブロックするように見えるコードが書ける。
- Futureは完全にモナドになった。したがってfor内包表記を利用できる。
- Futureはノンブロッキングメソッドを持つようになったので、ブロックなしでFutureの合成ができる。
- FutureはすべてのDispatcherからネイティブで実行できる。
関数型言語のプログラマはFutureがモナドになり、map
とflatMap
メソッドを備え、for内包表記が使えるようになったと聞けば喜ぶだろう。ドキュメントによれば、
val f = for { a <- Future(10 / 2) // 10 / 2 = 5 b <- Future(a + 1) // 5 + 1 = 6 c <- Future(a - 1) // 5 - 1 = 4 } yield b * c // 6 * 4 = 24
val result = f.get()
Scalaのfor内包表記はモナドなコードに対してHaskellのdo
のように使える。例えば、処理を直列に並べるための簡単な方法として利用できる(モナドの簡単な紹介は"Monads Made Easy")。
InfoQはGotoCon Copenhagen 2011にてJonas Bonér氏にAkka 1.1と将来の展望について話を聞いた。
InfoQ: Akka 1.1にはScala 2.9が必要ですが、なぜこうしたのですか。Scala 2.9の新しい機能を使っているのですか(どんな機能ですか)。Scala 2.8から2.9への移行でなにか問題にぶつかりましたか。
Scala 2.9.0は多くの点において2.8.xよりも優れています。私たちはバグフィックスや性能改善、新機能の恩恵を受けています。移行も大きな問題はありませんでした。スムーズに行えました。
InfoQ: Agentのawait/futureメソッドはどうですか。 awaitメソッドが返ったら現在のアクターを停止して再スケジュールしますか。
Agent.futureはアクターの現在の値を問い合わせるためにメッセージを送信します。これは!!!メソッドで行われます。このメソッドはFutureを伴ってすぐに返ります。
Agent.awaitはAgent.future.await.result.getの別名です。なのでブロッキングコールになります。Agent.futureは新しいノンブロッキングのFuture合成を利用できます。
InfoQ: Akka 1.1のデフォルトディスパッチャは1.0に比べてどの程度改善していますか。HawtDispatchは使いやすくなったり、高速になっていますか。
これは簡単には説明できません。繰り返し小さな改善を重ねてきたからです。HawtDispatchは決して早くなっていません。AkkaのHawtDispacherはAkkaのコアから取り除かれ、利用は非推奨になりました。低レベルのネットワークIOを実行するときだけは便利だと思います。下記は最新のベンチマークの結果です。
このベンチマークの結果の詳細はAkkaユーザリストでの議論を参照ください。
InfoQ: Akka 2.0で計画されている大きな機能/変更はありますか。
ええ、商用のAkkaのクラスタサポートをオープンソース版に移植するべく鋭意開発中です。秋にリリースする予定のAkka 2.0に盛り込みたいと思っています。クラスタリング(リモーティングでも分散配置でも好きな呼び方でかまいませんが)は完全に構成作業に抽象化されます。つまり、ローカルのアクターだけを使ってクラスタリングするよう(外部から)構成したり、複製したりするだけでAkkaのアプリケーションが利用できるようになるのです。
また、下記は他の特徴です。
Akka 2.0では、Akka 2.0移行は、
- 透過的で柔軟なロードバランシング/ルーティング
- 透過的で柔軟なクラスタリバランシング
- 自動リプリケーションとノードクラッシュ時の自動フェールオーバ
- 永続的なアクーターメールボックス
- サブスクリプションベースのクラスタメンバシップサービス(ノードの無停止での追加/削除)
- 高可用でスケーラブルなトランザクションログに基づくイベントソーシング
- 高可用な構成の一括管理サービス
Cloudy Akka(例えば、商用のアドオン製品)が監視や管理、プロビジョニング、ダッシュボードやEC2サポートのような運用を一手に引き受けるようになるでしょう。
- 計算グリッド/マップリデュース
- データグリッド
- 分散STM