Stormの内部実装を解説する資料確認してます(その4
前回に引き続き、Topologyのライフサイクルの章について読み進めます。
Topologyのライフサイクル
Topologyモニタリング
=====
■Nimbusは起動している間ずっとTopologyのモニタリングを行う。
1.Timerスレッドにて定期的にTopologyモニタリングタスクが実行される
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L623)
2.Nimbusの動作は有限状態マシン(active/inactive/killed/rebalancing)として示される。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L98)
3.モニタイベントは「設定値:nimbus.monitor.freq.secs」秒ごとに呼び出される。
モニタイベントにおいて、reassign-transitionメソッドからreassign-topologyメソッドを呼び出す。
4.reassign-topologyメソッドはmk-assignmentsメソッドを呼び出す。
このメソッドは初期にTopologyをアサインする際にも呼び出される。
mk-assignmentsメソッドはインクリメンタルにTopologyを更新可能。
−mk-assignmentsメソッドはHeartBeatを検知し、必要に応じてWorkerの再アサインを行う
−これらの再アサインはZookeeperの状態を更新することで行われる。
状態更新をトリガーとして、SupervisorはWorkerの開始/終了を行う。
=====
Zookeeperを介して状態更新が行われるので、意外にシンプルにすんでいるのかもしれませんね。
Topologyの終了
=====
■storm killコマンドを実行することにより、NimbusThriftインタフェースを通してTopology終了処理が開始する。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/command/kill_topology.clj)
■Nimbusは下記のコードにて、killコマンドを受信する。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L671)
■NimbusはTopologyの状態を「kill」に遷移させる。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L676)
■kill状態遷移のメソッドはTopologyの状態を「kill」に遷移させ、removeイベントを一定時間(設定値)後に実行するようセットする。
1.removeイベントの待ち時間デフォルト値はTopologyのメッセージタイムアウト値と同じ。ただ、storm killコマンドの-wフラグで上書き可能。
2.kill遷移時、Topologyの状態は待ち時間の間実際にシャットダウンするまでの間「非Active」となる。
Topologyシャットダウンの待ち時間は現状処理中のTupleがWorker終了までに処理完了となるためのバッファとなっている。
3.このTopologykillの状態遷移は終了待ちの間にNimbusがクラッシュしても維持されることを保証している。
Nimbusは起動時にTopologyのステータスが「killed」だった場合、Removeイベントを一定時間後に実行するよう設定するためである。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L111)]
■TopologyのRemoveタスク実行時にZooKeeperのTopology情報についても削除を行う。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L116)
■独立したクリーンアップスレッドも別個起動し、HeartBeat用のローカルディレクトリとTopology用の設定値ファイル/Jarファイルが削除される。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L577)
=====
比較的終了については単純な内容になっていました。
Topologyに関連するファイルについてもあわせて削除される・・・ということが明確になったのはよかったです。
これで、Topologyライフサイクルについても終了し、
次はTuple処理の肝であるMessage Passingになります。