無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

Erlang/OTP の設計原則を学ぶ - 監視ツリーとビヘイビア

監視ツリー (Supervision Trees)

Erlang/OTPの基本概念は、下記の図に示す監視ツリーです。これはワーカーとスーパーバイザーのアイデアに基づいたプロセス構造です。

  • ワーカーは、計算を実行するプロセスで、実際の作業をします。
  • スーパーバイザーはワーカーの挙動を監視するプロセスです。スーパーバイザーは何か問題があった場合にワーカーを再起動することができます。
  • 監視ツリーは、コードをスーパーバイザーとワーカーに階層的に配置したものです。これによって、耐障害性のあるソフトウェアを設計し、プログラム可能にします。

f:id:storkibis:20191014140208p:plain

上記の図の、四角はスーパーバイザーです。円はワーカーを示しています。 スーパーバイザーにぶら下がる形でワーカーが起動し、ぶら下がっているスパーバイザーに監視されます。普通は木構造を構成し、根や節はスーパーバイザーで、葉ノードがワーカーになります。

ビヘイビア・振る舞い (Behaviours)

監視ツリーでは、多くのプロセスに共通する構造・パターンがあります。

例えば、多くのスーパーバイザーは似たような構造をしており、実質的に異なる点はどの子プロセスを監視するかということだけです。

多くのワーカーもサーバー・クライアントの関係であったり、有限状態機械であったり、イベントハンドラーなどのパターンをとります。

ビヘイビア はこれらの一般的なパターンの形式化です。アイデアは、プロセスのコードを一般的な部分(ビヘイビアモジュール)と特定の部分(コールバックモジュール)に分けることです。

ビヘイビアモジュールは Erlang/OTP の一部です。スーパーバイザーなどのプロセスを実装するには、ユーザーはコールバックモジュールを実装するだけで済みます。

標準の Erlang/OTP のビヘイビアは下記の4つあります。

  • gen_server - クライアントとサーバーの関係のサーバーを実装するためのビヘイビア
  • gen_statem - 状態機械を実装するためのビヘイビア
  • gen_event - イベント処理機能を実装するためのビヘイビア
  • supervisor - 監視ツリーのスーパーバイザーを実装するためのビヘイビア

コールバックモジュールには、どのビヘイビアのモジュールであるかを指定するために、-behaviour(Behaviour) というモジュール属性を記述することができます。コンパイラーはこのモジュール属性を理解し、コールバックモジュールに必要なコールバック関数がない場合、警告を発行します。