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 って良くできてる。