Learning Akkaを読んだ

www.amazon.co.jp を読みました。(2015/12/24発売)

全体を通してJava8とScala版のコードが併記されているので賞味としてはもう少し短くなりそうです。

この本では、akkaを使った並行処理だけでなくakka-remoteを使った分散システムの作成にも取り組みます。 ただ分散システムの難しいところに触れるというよりは、さらっとakka-remote, akka-clusterの使い方を触れるという感じになるので 初めてakka使う人でも楽に読めるはずです。

簡単な所からはじめつつ、

みたいなakka周辺(並行処理・分散システムなど?)を勉強するなら当然抑えておくべき基本的なトピックを体系的に抑えてくれる内容になっています。

akkaの話も地に足がついている感じで初歩的ですが抑えておくべき部分が体系的に学べる内容になっています。

例1: 最初はaskで書いてみて、askはタイムアウトがあるけどタイムアウトしたときのスタックトレースってsystem.schedulerの情報が出るだけでデバッグが難しい。 しかもreplyするときに sender() が原因でハマるとつらいよね。なのでtellで書いてみましょう。 tellバージョンでタイムアウトが欲しいときは使い捨てアクター作りましょう。オーバーヘッドが気になる?askも中で使い捨てアクターつくってるから遅くはならないですよ:)

例2: コンストラクタにDB接続情報を渡して、すぐにDBに接続させたいときはプライマリコンストラクタやpreStartでやるとActorInitializationExceptionが出てしまうので そういうことをしたいときはpreStartで自分にメッセージ投げるとよいです。(初期化情報はコンストラクタに渡さないとrestartしたときに消えてしまいます。なので外側から初期化メッセージを初期化情報と共に送るやり方はうまくいきません)

例3: DBへのリクエストなどのブロッキング処理やCPU負荷が高くなりうる場所では(ExecutionContextを分けるように)Dispatcherを分けましょう。基本はForkJoinを使うdefault dispatcherで良いです。ちなみにTestActorRefで同期テストが出来るのは、dispatcherがCallingThreadDispatcherになるからです。actorのdispatcherは他にもあって例えばBalancingDispatcherにすると全アクターでメールボックスを共有するからワーカーのロードバランシングに良いです。(ただリモートでは使えません。)

みたいな感じで、簡単なサンプル -> 問題点 -> 改善&なぜそうすべきか・akkaの動作の仕組みが簡潔に書かれています。 この辺もきっちり簡単なところから抑えていってくれるので基礎固めにはよさそうです。

またサンプルコードにテストがちゃんと付いてるのでテスト書きたいときは参考にできそうです。(actorsystem.shutdownが適切に呼ばれてなかったりするので鵜呑みは危険ですが・・・。)

テストの件もそうなんですが、サンプルコードもScalaなのにJava版のコードに似せたのかScalaっぽくないというかakkaのJavaAPIを呼んでたりするところがあったりしてうーん?というところがあったり、postStart(多分preStartの間違い?)を使いましょうと書いてあって、完全にはオススメしきれない微妙な気持ち・・。

注意点ですが、kindle, epub版は本文中のコードが改行すら壊滅的に崩れおちているので電子版ならPDFを入手するようにしたほうが良さそうです。 amazonのレビューにkindle版はコードがやばいとあったので、Learning Akka | PACKT Booksで買ったのですが、 epub版もダメでした。PDF版は普通に読めるのでPDF版を読むのが良いと思います。(packtpubでpdf版も入手できます)