AkkaのActorをテストする(Java編)
この記事は最終更新日から8年以上が経過しています。
http://letitcrash.com/post/30165507578/shutdown-patterns-in-akka-2
を読んでのメモ
☆が付いてるのは所感
それ以外は記事の適当に訳してまとめたもの
Shutdown Patterns in Akka 2
「すべての処理が終了したらActorSystemをシャットダウンするにはAkkaにどう命令したらいい?」
以下を議論する
- 「適切なタイミング」でシャットダウンするための簡単な方法
- 同じことをやるためのそれほど簡単ではない方法
What the Heck Does “Finished” Mean?
- まず “Finished” をどう定義するか
- 「メールボックスが空になった時」(正確に言えば間違ってるけど)
- まだメッセージを送信してないアクターがいる可能性があるから
- 図のようにメースボックスの中身を全部飲み込んで処理中のやつがいたりするしね
- 一気のみするアクターが数百発生する確率は低い
- ただ確率が上がるごとにそのアプリは終わりに近づくけどね
- それが0.004%だったとしてもアルゴリズムをデザインするプラットフォームとしては疑わしい
- 「アクターが機能しているか知ることができるので、メールボックスがからじゃない時と機能しているときは停止しないで!」
- そうはいうけどこういう時↓は停止したくないでしょ?
- もしアクターが未来の作業を生成していたら?
- 別のマシンの要求を待っていたら?
- 逆にアプリを動作実態とは逆に"ビジー"に保つ単純な何かがいるとしたら永遠にアプリを実行し続ける?
- ふつうやらないよね
- そうはいうけどこういう時↓は停止したくないでしょ?
The DABOWoTeD Pattern(Do A Bunch Of Work Then Die pattern)
- 「房ごとに死んでいくパータン」
- ☆DABOWoTeDの発音になんか意味があるらしいけど分からなかった
- 24/365で動いてるアプリはシャットダウン時の動きをそんなに気にしてないんじゃない
- ハードウェア障害に対応するほうが頻繁だと思うし
- 仕事をさせるために幾つかのアクターを房にする
- その仕事が「完了」している時がシャットダウンするとき
Futures
- Futures はすべてが完了したのを知る簡単な方法
- シーケンシャルに処理できる
- 基本的に大きなfork-joinをやってるだけ
- すべてがjoin upした時にそのシステムをシャットダウンする
Acotr
- “Finished”が明確じゃない
- アルゴリズムにアクターが高いレベルで入り込んでいるから
The Reaper
- 死神
- アクターの死を監視するアクター
- 監視しているアクター(図では緑)がすべて死んだ時システムを終了させる
- 死んだアクターの通知をすべて集めた時、死神がシステムを終了に向かわせる
Reaper Code
- Reaper自体は簡単、ActorRefを監視してそれらが死んだ時にキックするメソッドを作るだけ
A “Production” Reaper
- 死神の簡単さから考えて、Production Reaperを作ることができる
- すべての魂を集め終わったらActorSystemをシャットダウンするような
Testing the Reaper
- Akka の テストキットを使ってReaperをテストする
Application with PoisonPill
- Reaper はとても柔軟
- あるゴールがメールボックスから排出される場合
- メッセージの束をアクターに送り、他のアクターにもメッセージが送られるシステムが有るとする
- メールボックスからあるキーが排出された時にシャットダウンしたい
- そういう時は PoisonPill メッセージを利用する
- PoisonPill はActorのメールボックスに入り、やがてActorを殺す
- 重要なのはPoisonPillより前に受け取ったメッセージはすべて処理されるということ
- system.stpoを使ってActorを殺した場合にはそうならない
- 最後のPoisonPillが処理されるとReaperがキックされActorSystemがシャットダウンされる
- メールボックスからあるキーが排出された時にシャットダウンしたい
- ☆PoisonPillを受け取ったら自殺するようにActorを作ればいいのか
Conclusion
- Akkaはあなたが何をやってるか知らない
- しってるのはあなた自身だけ
- Reaperパターンはシステムに抽象レベルを設定するために使用された
- Actorの基本的な機能を使用してアプリケーションに「システムレベル」の振る舞いを追加するための