前回は、プロセスがエラーでダウンしても、スーパーバイザが自動でリカバリーしてくれる様を見ました
その中で、以下4つの疑問が出てきました
- 気軽にプロセスを再起動したけど、負荷とか大丈夫なの?
- 負荷は大丈夫だとしても、プロセスが処理していた状態やデータとかどうなるの?
- 地味に、cdサーバと一緒にpwdサーバもダウンしてるけど、障害切り分けとして、マズくない?
- 「strategy: :one_for_one」というコードの説明が無かったけど、これ一体、何?
今回は、1つ目の疑問を検証する前段として、スーパーバイザのプロセス構成を確認します
【お知らせ】今回の連載の更に先を、今月末8/24(金)開催の「fukuoka.ex #2」でセッション・LTします
今連載で扱っているGenServerとスーパーバイザを活用した、ElixirとPhoenixにおける耐障害性について、連載内容に無い応用や、より詳しい内容でセッションします
https://techjin.connpass.com/event/63493/
スーパーバイザのモジュール化
まず、前回はiexで手打ちしてたスーパーバイザ起動等をモジュール化しておきます
import Supervisor.Spec
defmodule PassSupervisor do
def start_link() do
servers = [ worker( PassGenServer, [ 0, [ name: :server_process ] ] ) ]
Supervisor.start_link( servers, strategy: :one_for_one )
end
def cat( parameter ) do
GenServer.call( server_process, { :cat, parameter } )
end
def pwd() do
GenServer.call( server_process, :pwd )
end
end
スーパーバイザ経由でサーバプロセスを起動します(念のため、クライアント呼出の確認も)
iex> PassSupervisor.start_link()
--- PassGenServer.start_link( 1, [name: :servers_process] ) ---
{:ok, #PID<0.1980.1>}
iex> PassSupervisor.pwd()
"/code/pass"
iex> PassSupervisor.cat( "a.txt" )
"I'm a.txt"
スーパーバイザのプロセス構成をObserverで見る
Erlangから受け継いだモニターツール「Observer」をiex内から起動し、スーパーバイザプロセスとサーバプロセスが起動していることを確認します
# iex -S mix
iex> :observer.start
「Processes」タブを選択し、スーパーバイザ起動時に表示された「PID<0.1980.1>」を探します
ダブルクリックすると、スーパーバイザのプロセス詳細が表示され、「Links」枠にこのスーパーバイザと連なっているプロセスへのリンクがあるため、スーパーバイザの次に振られたであろうPIDをクリックします
GenServerのプロセス名なので、アタリでした
「Dictionary」タブを見ると、GenServerで起動したモジュール名も見れます
スーパーバイザと、その配下のGenServerのプロセス構成が、これで確認できました
それでは実際に、プロセス起動やスーパーバイザでの再起動における負荷を確認します
(次回に続く)