Akkaとは
- 並行・分散アプリケーションをシンプルに単一のモデルで実装するプログラミングモデルであるアクタープログラミングモデルを提供する
- アクターはスケールアップとスケールアウトのためのプログラミングモデル
アクター概要
- メッセージキューに似ている
- アクターは1通ずつメッセージを受信し、その都度何らかの振る舞いを実行する
- アクターは他のアクターにメッセージを送ることができる(キューとは異なる)
- 全て非同期
- メッセージの送受信でアプリケーションを構築する
- メッセージは、ローカルスレッドまたは、リモートスレッド(別のサーバ)で処理する
リアクティブ (宣言)
- ブロッキングI/Oは並列化を制限するため → ノンブロッキングI/O
- 同期処理は並列化を制限するため → 非同期
- ポーリングはリソース消費機会を減らしてしまうため → イベント駆動
- 回復力(レジリエンス)
- 弾力性(需要が小さければリソース減、需要が大きければリソース増)
アクターシステム
- Akkaのアプリケーションで最初に行うことはアクターシステムを作成すること
- アプリケーション内の全てのアクターに対してトップレベルアクターを1つだけ作成するのが一般的なパターン
val supervisor = ActorSystem("TeamChat")
ActorRefは、アクターにメッセージを送信するためのアドレス アクターシステム内でアクターを探したい場合はアクターパスを使う アクターパスはURLパス構造とアクターの階層をマッピングできる メッセージはActorRefに送信され、メールボックス(キュー)に到着順に保存する
ディスパッチャー
アクターはディスパッチャーによってある時呼び出される ディスパッチャーはメールボックス内のメッセージをアクターにプッシュする アクターは落ちてきたメッセージを処理する 複数スレッドの場合は、複数のアクターが処理する
アクターにメッセージを送信するときは、メールボックスにメッセージを残すだけ ディスパッチャーがアクターにメッセージをプッシュする
並行処理の歴史
- OSのプロセスによる並行処理
- スレッドによる並行処理
並行と並列
CPUがどんな様子で処理をするのか?という観点において、
- 並行(Concurrent)
ある1つの時点で、複数タスクを切り替えることで同時処理を見せかけている
- 並列(Pararell)
ある1つの時点で、複数タスクを実際に(物理的に)同時処理している
プロセスとスレッド
- プロセス
実行プログラムは親プロセスと共有し、実行状態(変数など)は子プロセス独自に割り当てられたメモリ領域を使う - スレッド // TODO
スケールアウト
スケーリング
クラスタリング
フェイルオーバー
- 稼働中のシステムで問題が生じてシステムやサーバーが停止してしまった際に、自動的に待機システムに切り替える仕組みをいいます。HA機能ともいわれ、システムの可用性を高めるための冗長化の一つです。
// TODO
Akka によるスケール
- ここでは、アクターをオブジェクトとして理解しておく
- インメモリ状態を使い続ける
- 状態の変更は、メッセージとしてログに送られる
// TODO
CPUがどんな様子で処理をするのか?という観点において、