Developing an Akka Edge
Chapter 1-3
この本について
Developing an Akka Edge
(著)Thomas Lockney, Raymond Tay
Akka初心者向けの洋書
全191ページ・10章
せっかく読んでるので要約しました
※自分で調べた事や、考えた例も載せたのでスライドに正しくないことが書いてある可能性があります※
各章の概要
Chapter 1…ロックを使った並列処理がよくない理由
アクターの概要
Chapter 2…とりあえずAkkaを動かしてみる
Chapter 3…ビルドツールの紹介 & ログの出し方など
Akkaを触った事がある人はChapter4からでいいかも
Chapter 1. Introduction
・並列処理のよくあるテクニック
⇒データを共有させて、ロックを使って整合性を保つ
・しかし、ロックにはデメリットがある
デメリット① 処理速度が頭打ちになる
例「Webサイトにユーザーが訪れたらカウントする」
合計値を更新するメ
ソッド
スレッド
A
スレッド
B
使用中なら待つ
スレッドが増えると待ち時間が無限に…
例「Webサイトにユーザーが訪れたらカウントする」
合計値を更新するメ
ソッド
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド スレッド
スレッド
スレッド
スレッド
スレッド
使用中なら待つ
デメリット② デッドロック/ライブロック
2つのインスタンスのロックを取ろうとして
1つ取ったが、もう1つがロックされていた時
スレッド
A
スレッド
B
デッドロック
お互いがお互いのロックを解放するのを待っている
⇒ずっと動かないまま
スレッド
A
スレッド
B
ライブロック
一度ロックを解放して、もう片方のロックを取る
⇒どちらも片方のロックを持っているので、取得と解放を繰り返し続ける
スレッド
A
スレッド
B
他にも
設計が大変などいろいろデメリットがあるので
アクターモデルを使いましょう
アクターについて
・メッセージのやりとりを使った計算機処理の手法
1973年に論文が発表された
・Actorとは1つのエンティティ
メッセージの送受信を通して他のアクターとやりとりする
メッセージを受け取った時の処理を定義しておく
Actor
case “How are you?” => sender ! “I’m fine thank you”
case “Nice to meet you” => sender ! “Nice to meet you too”
case s:String => sender ! “Pardon?”
メッセージを受け取った時の処理を定義しておく
①アクターがメッセージを受信する
Actor
case “How are you?” => sender ! “I’m fine thank you”
case “Nice to meet you” => sender ! “Nice to meet you too”
case s:String => sender ! “Pardon?”
“How are you?”
メッセージを受け取った時の処理を定義しておく
①アクターがメッセージを受信する
②定義されたふるまいをする
Actor
case “How are you?” => sender ! “I’m fine thank you”
case “Nice to meet you” => sender ! “Nice to meet you too”
case s:String => sender ! “Pardon?”
“How are you?”
“I’m fine thank you”
結局
・メッセージが来たらアクターのMailboxに貯まる
・メッセージを到着した順に1つずつ処理する
・あらかじめ定義されたふるまいを実行する
Akkaのアクターの特徴
・アドレスを持つ
アドレスを使ってメッセージを送れる
・子アクターを作ることができる
ヒエラルキーを構成する
ヒエラルキー
・1つのアクターを始点としてヒエラルキーを構成する
どんなアクターを作るときもActorSystemの参照が必要
ActorSystemの内部のアクターの子としてアクターを作れる
ヒエラルキー
Akkaの構造がヒエラルキーになっている理由⇒耐障害性
親アクターは子アクターにExceptionが発生した時にどうするか決められる
・子アクターを再起動させる
・子アクターを再開させる
・子アクターを終了させる
・例外を次の親に投げる
ヒエラルキー
ヒエラルキーはファイルシステム的な感じで、分かりやすい
例:accountingというActorsystemから作られた
accountMonitorというアクターから作られた
accountCrediterというアクター
akka://accounting/user/accountMonitor/accountCreditor
Akkaのアクターの特徴②
遠隔操作
本当にスケーラブルな並行処理の鍵となる
アクターがどこにあっても
(同じマシンでも、違うJVMのインスタンスでも、全く別のマシンでも)
同じように動く
アクターのアドレスさえ知っていればローカルもリモートも関係ない
⇒location transparency
Chapter 2.Working with Actors
・既存プロジェクトへのアクターの追加の仕方
・とりあえずアクターを動かしてみる
Putting actors to work
アクターを使うのにまず必要な事
・akka.actor.Actorトレイトを継承したクラスと、そこにreceiveメソッドを定義
・ActorSystemを作る
・ActorSystemからアクターを生成
receiveメソッドを定義
ActorSystemを生成
ActorSystemからさっき定義したアクターを生成
Actorインスタンスを作って開始させるとActorRefインスタンスが取得できる
*この時点でもう非同期になっている*
ActorRef…Akkaのアクターを参照する時に必ず使うオブジェクト
Propf…アクターを作る時に使われる設定オブジェクト(ファクトリー的な)
アクター内部からActorSystemにアクセス
contextというプライベート変数
context.system :自分がいるのアクターシステムを参照できる
context.stop(ref):ref(他のアクター)を停止させる
非同期に他アクターの開始・停止ができる
メッセージの送り方① tell
ActorRefオブジェクト と !メソッドを使ってメッセージを送れる
メッセージの送り方② ask
?メソッドはFutureを返す
Futureの中身…送り先のアクターが返す値(処理済/まだ処理されていない/永遠に処理されない)
永遠に処理されない可能性もあるので、implicit valを使って時間を設定
アクターへ送るメッセージは非同期なので、アクター以外のコード内でレスポンス
を得るにはFutureを使う必要がある
Futureの中身を取り出す
onCompleteメソッドはFutureインスタンスで使えるコールバック
mapToで戻り値の型を指定
設定したタイムアウトの時間を過ぎるとFailureが返される
最後に必ずActorSystemを終了させないといけない
Chapter 3.Running with Akka
・ビルドツールはいろいろあるけど、sbtがおすすめなのでちょっと紹介
・ロギングとか
The sbt build defenition
AntやRave⇒ビルドファイル名が指定されてる
Mavenやsbt⇒ディレクトリ構造が指定されてる
sbt
Scalaのコード ⇒ src/main/scala以下と src/test/scala以下
設定ファイルなど ⇒ src/main/resources以下と src/test/resources以下
(設定でいろいろかえられる)
build.sbtに設定を書く…project名とか、Scalaのバージョンや依存性
*決まり事*
全ての設定は空行をはさむ
:= 設定の割当
+= 既にある設定に追記(libraryDependenciesとか)
++= コレクション(Seqとか)を設定に追加する
%%はScalaのバージョンを追記してくれる
akka-actor_2.10
sbtで使えるタスク
upload…依存ライブラリの更新
compile
test
run…mainメソッドを探す
1つ以上あれば、どれを実行するかプロンプトに表示される
Akka and application configuration
AkkaではActorSystemの設定に TypesafeConfig library を使っている
JSONみたいな感じ
HOCON(Human Optimized Config Object Notation)と知られている
独自の設定は /src/main/resources/application.conf に記述する
書き方①
書き方②
Logging in Actors and elsewhere
Akkaのロギングは(もちろん)非同期
ロギングの方法
①デフォルトのLogging機能を使う
②ActorLoggingトレイトをミックスインしたものを使う
akka.actor.debug.receive = on
ミックスインしたクラスに def receive = LoggingReceive{}を定義
①デフォルトのLogging機能を使う
build.sbt
application.conf
あとロギングのXMLを定義
②ActorLoggingトレイトをミックスイン
application.conf
クラスを定義
JavaベースのLoggingフレームワークと同様に
error,warning,info,debug が使える
{}でログ内に代入できる
ビルドの仕方、ログの出し方が分かったので
次の章ではAkkaの特徴について触れる

Developing an Akka Edge1-3