More Related Content
Similar to 並行処理初心者のためのAkka入門 (20)
More from Yoshimura Soichiro (9)
並行処理初心者のためのAkka入門
- 6. Akkaを知る前に
• 並行処理
• アクターモデル
この二つを知らないといけない。
今から上記二つをざっくり説明して、
Akkaの機能もざっくり解説する
- 8. 並行処理の歴史
1. OSのプロセスによる並行処理
• 資源の有効利用: 入出力のような外部操作の待ち時間
• 公平性: 複数のユーザーで複数の処理
• 利便性: 一つのプログラムで一つのタスクの方がシンプル
➡タイムシェアリングシステムでメモリは別
2. スレッド (軽量プロセス)による並行処理
• プロセスと同じ動機
• ひとつのプロセス内で複数のお仕事
• メモリ、ファイルハンドルは共有
• 共有データへのアクセスは明示的な同期化が必要
- 14. オブジェクトの
共有の難しさ
• synchronizedによるlockでの同期
• volatileによる揮発性変数の利用
• ただし同一スレッドからの書き込みの
みの場合に限る
• 同期化されてない内部変数を逸出しない
ような入念なチェックが必要
- 16. ちなみにJavaの
concurrentパッケージの概要
名前内容
Executor フレームワークスレッドを、CallableとFutureで扱えるようにしたり、
並列度やリトライ、スケジュールを制御できる
Concurrent コレクションJavaのコレクションをマルチスレッドで扱えるようにし
たコレクション群、putIfAbsentとかもある。
Atomic パッケージAtomicLongやAtomicReferenceなど、並行処理で変更
しても問題が起こらない値や参照のクラス群
ReentrantLock 再利用可能なロック。いわゆる排他処理とかMutexとか
いわれるものを実現。tryLockとlockの両対応。
CyclicBarrier 全スレッドがバリアに到達するまで待って、何かを実行
してくれる部品
CountDownLatch 指定した数まで処理が実行されるまで、全スレッドを待
たせてくれる部品
Semaphore 一度に指定された数のスレッドしか実行されないように
してくれる部品
DelayQueue 特定の時間が経過すると中身を取得できるようになる
キュー
- 22. 現状スケールのためには
• マルチコア
• クラスタ構成
が、今の大規模サービスの基本戦略な
ので、すごく今の現状にマッチ
1985年ぐらいにアクターモデル理論として完
成したらしい…ここらへんの学術的な話は→
Wikipediaのアクターモデルを見てください
- 30. Akka Actorの主な特徴
• ActorSystemというActorの実行コン
ポーネントが内部的にスレッドプールを
持っており、tellによるメッセージパッシ
ングのイベント駆動モデルと、マルチス
レッドによる実行の融合がなされている
• デフォルトでは、単一実行するMailboxの
実装により逐次メッセージが処理される
- 33. Akkaで実現できる機能
• 並行処理
• 分散処理のために子どものアクターを作る
• アクターが失敗した時に再実行する
• アクターのメッセージの結果をFutureで受け取る (ask)
• メッセージの送信元を知る
• メッセージ送信のスケジューリング
• リモートのアクターへのメッセージ送信
• アクター同士のゴシッププロトコルによるクラスタリング
• トランザクションの実行とロールバック
• ロギング
- 34. どんな用途に向いているか
スケールアップ、スケールアウト、耐障害性の必要な
• トランザクション処理
• サービスのバックエンド処理
• 並行処理
• 大規模なシミュレーション計算
• バッチ処理
• コミュニケーションハブ
• オンラインゲーム、賭けなどの実装
• BIやデータマイニング
• 複雑なイベントストリーム処理
http://doc.akka.io/docs/akka/2.3.6/intro/use-cases.html
- 35. Akkaの基本的な機能の解説
• Actor
• ActorSystem
• tell, ask
• SupervisorStrategy
• ActorPath
• DeadLetter
• Akka Cluster
- 41. ask (別名: “?”)
• Actorにメッセージを投げて、
返答を待つ
ブロッキングするのではなく、
Futureオブジェクトが返る
- 50. Akka Cluster
• Akka Remoteを利用した、複数ノード構成
のAkkaアプリケーションを構築するエクス
テンション
• ノードのメンバー管理、クラスタへのノード
のJoin・Leaveを行ってくれている
• 参加のやりとりはゴシッププロトコル
• 論理時間はベクタークロックアルゴリズム
- 51. ノードの役割
• シードノード
- 最初にクラスタに参加するノードが接続するためのエン
トリーポイント
• リーダー
- クラスタを管理するノード、リーダーがクラスタから落
ちると別のノードがリーダーに昇格する
• ロール
- 各ノードに複数のロールを持たせることができる (ただの
文字列)
- 53. ノードの状態
• ノードは一生の中でいくつかの状態を取る
• この状態の管理はリーダーノードが行い、
クラスタ全体で共有される
状態意味
joining クラスタに入ろうとしている
up クラスタに正常に入った状態
leaving/exiting クラスタから正常に抜けようとしてる状態
down ノードが落ちた状態
removed クラスタから削除された
- 56. 利用する時に
気をつけること
• ActorSystemをたくさん作らない
• メッセージに型がない
• シリアライズ不可能なメッセージを投げない
• DeadLetterに注意する
• Mailboxのサイズに注意する
• ActorPathに注意する
- 61. MailBoxのサイズに
注意する
• メッセージが無限に入るので処理が遅
れてることに気がつかない
• 対策としては、Mailboxにサイズ制限を
設ける
• デフォルトでは無制限
- 63. もっとAkkaについて
知りたい
• akka-user、akka-devを見る
• akkaのコードを読む (https://github.com/
akka/akka)
• Effective Akkaという洋書がKindleで読める
- 67. Akka Streamsの用途
• バルクデータの転送
• リアルタイムデータソース
• 巨大データセットのバッチ処理
• 監視/解析
http://www.slideshare.net/rolandkuhn/reactive-streams
- 68. Akka StreamsでのFlowの処理例
• データをストリー
ムとして処理
• Flowの情報受取
元はTCPを選択す
ることもできる
http://typesafe.com/activator/template/akka-stream-scala