Play 2.0 と 2.1 での Akka Actor の使い方の違い

Play を使おうとしたら、全然パフォーマンスがでない、なんで? → Akka のチューニングが必要だった。
という話は Play 2.0 の頃から結構有名な話でした。

http://qiita.com/items/0c4bb34a420665536db4
http://tech.furyu.jp/blog/?p=2069
http://gendosu.jp/archives/1945

Play 2.0 では

  • Request に対して BodyParser を適用するところ
  • Action のディスパッチ

の 2 箇所で Akka が使われていました。
コードで言うとここらへん、ActionInvoker というクラスです。
https://github.com/playframework/Play20/blob/2.0/framework/src/play/src/main/scala/play/core/system/Invoker.scala#L65-L94


さて、Play 2.1 では実はここのコードがごっそりとなくなっています。
Play 2.1 から EssentialAction というものが導入されたのですが、それに伴う変更のようです。

https://github.com/playframework/Play20/commit/7d4f7ef05f32b8dd80f8f93d7362948f27c098b4

今まで Actor を使っていたところが、scala.concurrent.Future ベースで書きなおされています。


ということは、Akka のチューニングってもう要らないわけ?と思ったのですが、そういうわけではありません。
Future のための ExecutionContext に Akka の dispatcher を使っていました。
akka の dispatcher は ExecutionContext インタフェースを実装しているらしい。
https://github.com/playframework/Play20/blob/2.1.0/framework/src/play/src/main/scala/play/core/system/Invoker.scala#L23

というわけで、Akka のチューニングはやっぱり必要みたいです。

感想

  • Akka はまだ使われているが、Akka Actor を使ったコードは表に出なくなった。
  • 単純な非同期プログラミングをするなら Actor じゃなくて scala.concurrent.Future のほうが良い。
  • Akka って良くできてる。