Blog

【Akka入門の入門】Part.2 アクター子アクター孫アクター


新卒の増田です(^o^)
前回に引き続きAkkaの超基礎的な事についてコードを交えて説明していきます!
(前回は顔文字多すぎ…みたいな声もあったので今回から少なめにしますw)

前回はメッセージを送っただけでした。
アクターには「どのメッセージを受け取ったら何をするか」を定義して、メッセージを送ることによって非同期にアクターを操作し並列処理を行います。

アクターにメッセージを送る時、アクターを参照しているインスタンス(ActorRefインスタンス)を使いました。

 

ですが、なんとこれを使わなくてもメッセージを送る方法があります!

全てのアクターはアドレスを持っていて、アクターが生成された時に

このようにアドレスが割り当てられます!
akka://mySystem/user/$a#486500662
前回作ったプロジェクト上でsbt consoleコマンドを使うと、そのプロジェクト内で書いたクラスが対話形式で使えます、便利ですね〜(^o^)

ちなみにアクターを生成する時に名前を付けると

アドレスにさっき付けた名前が入っています(^o^)
akka://mySystem/user/masuda’sActor#-1513573312

このアドレスを知っていればメッセージを送ることができます。
ところで、URLやファイルパスと同じ階層構造になっていますよね?

実はActorSystem全体がヒエラルキー構造になっていて、アクターが子アクターを作る事ができます。
実際に例を見ないと分かりにくいので、親子アクターを作ってみましょう!

 

「親アクターは子を監視する」という意味で、親アクターの事を今後はSupervisorと呼びます…!

それぞれのアクターにreceiveメソッドを定義したのは前回と同じです。
ChildActorはStringのメッセージが来たらprintlnして
SupervisorActorはStringのメッセージならprintln、ForChild型ならchildActorに中のStringを送ります。
Child型なら送信元にchildActorのActorRefを送ります。

今回はSupervisorActorのpreStartメソッド内で、childActorを生成しています!
preStartはアクターが起動する前に実行されるメソッドで、他にもpostStop・preRestart・postRestartがあります。

ではSupervisorActorにメッセージを送りましょう

 

Supervisorに送ったメッセージがChildに送られています!
ちなみにChildというメッセージを送信して、childActorのActorRefを取得すると…

 

(askのためのimportやimplicitなど前回やった諸々は省略…)
childActorのアドレスがakka://mySystem/user/supervisorActor/childActorになっていて、supervisorActorの下の階層になっています!!

ActorSystem全体がヒエラルキーになっていて、自分で作ったアクターはそのトップのアクターの子アクターになってます。
(supervisorActorはmySystemのrootアクターの子アクターのuserアクターの子アクターということになります。)
guardians
Akkaのドキュメント参照

それで…?
って感じでしょうか(´-ω-`)

でも、このヒエラルキー構造がAkkaの耐障害性UPに重要な役割を果たしているのです!!
…詳細は次回(^o^)!!

(↓その重要な役割が完全にネタバレになっちゃいますが、私が勉強した事をまとめたスライドその②です↓)
[slideshare id=43156248&doc=devakka4-5-150102143643-conversion-gate01]

Author

アバター
admin