44
Developing an Akka Edge Chapter 1-3

Developing an Akka Edge1-3

Embed Size (px)

Citation preview

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の特徴について触れる