Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Developing an Akka Edge1-3

18,645 views

Published on

Developing an Akka EdgeというAkkaの入門書を読んで勉強しています。
要約して社内勉強会で発表した時のスライドを手直ししたものです。

Published in: Software
  • Be the first to comment

Developing an Akka Edge1-3

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

×