Erlang

すごいErlangゆかいに学んだメモ 19章 OTPアプリケーションの作法

Erlang でアプリケーションをパッケージングする定石作法について

OTPアプリケーション

Erlangアプリとは、関連するコードプロセスの集まり。

  • OTPアプリケーションとは
    • プロセスに対してOTPビヘイビアを適用している
    • アプリ全体の構築と解体方法をVMに伝えることができる特別な構造で、そのプロセスをラップしている

OTPアプリケーションは、以下を提供する

  1. ディレクトリ構造
  2. 統一的な設定方法
  3. 環境変数と設定の生成方法
  4. 依存関係を考慮しつつアプリケーションを起動停止する方法
  5. アプリケーションを終了することなく, 衝突を検知し, ライブアップデートを安全に制御する手段

OTPコンポーネント != OTPアプリケーション

なお、すべてのOTPアプリケーションは kernelstdlib に依存する.

アプリケーションリソースファイル

拡張子 .app のファイル.
中身はErlang項が書かれており, ErlangVMにアプリケーションについての情報を伝える.

このファイルはアプリケーションのエントリポイントや終了方法などを伝える.
これは、コンパイル済みのモジュールと一緒に /ebin に保存する

.app.src というファイルを src/ 以下に置く場合もある。
その場合, コンパイル時に app.srcapp になって /ebin に置かれる.
好みの問題だが、現在はこのパターンが主流.

書式の例は以下

{application,
 myapp,  %% アプリケーションの名前をatomで指定
 [{description, "アプリの説明文をここに"},
  {vsn, "0.1.0"},  %% バージョンを指定. コードのホットスワップ時にも使用される
  {registered, []},  %% アプリケーションによって登録されるレジスタ名のリスト
  {mod, { myapp_app, []}},  %% applicationビヘイビアを実装したコールバックモジュールと引数を指定
                            %% ここを記述しない場合はライブラリアプリケーションとして扱われる

  %% 依存するアプリケーションをリストで指定する
  %% 全てのOTPアプリケーションはkernel と stdlib に依存している
  %% ここで指定されたアプリが先に起動する
  {applications,
   [kernel,
    stdlib
   ]},
  {env,[
      {hoge, "FUGA"}  %% 環境変数を指定
  ]},
  {modules, []},  %% rebar を使っているなら自動で処理される箇所
  {maintainers, []},
  {licenses, ["Apache 2.0"]},
  {links, []}
 ]}.

アプリケーションビヘイビア

  • アプリケーションコントローラ(AC)

    • ErlangVMが起動するときに、一緒に起動されるプロセス
    • ACは他の全てのアプリケーションを起動し、それらの上位に位置する.
      • 実質、各アプリケーションのスーパーバイザのような立ち位置
  • アプリケーションマスター

    • アプリケーションを起動するとき、ACが起動するプロセス
    • 各アプリケーションを世話する、2つからなるプロセス.

AC --> アプリケーションマスター --> 各アプリケーションのスーパーバイザ という構造.

アプリケーションビヘイビアのコールバック関数

アプリケーションビヘイビアが必要とするコールバック関数は以下の2つ

  • start/2
    • YourMod:start(Type, Args) という形式
    • Type は常に normal
    • Args はアプリケーションリソースファイルの {mod, ...} からから取得されるオプション
    • start はアプリケーションの初期化を行い、最上位のスーパーバイザのpidを返す
  • stop/1
    • start/2 で返される状態を引数に受け取る
    • アプリケーションの実行が終了したあとに動作し、必要な終了処理を行う

applicationモジュールの関数

  • application:start(AppName).
    • アプリケーションコントローラに対して指定したOTPアプリケーションを起動するように伝える.
    • 第二引数にプロセスタイプを指定可能
      1. temporary
        • 正常終了は再起動しない
        • エラーで落ちても再起動しない
      2. transient
        • 正常終了は再起動しない
        • 異常終了のとき、他のアプリケーションも停止してVMも止まる
      3. permanent
        • 正常終了のとき他のアプリケーションも終了し、VMも止まる
        • 異常終了のとき、正常終了と同じ動作
  • application:which_applications
    • 現在起動しているアプリケーションのリストを取得できる

ライブラリアプリケーション

特に起動するプロセスがないモジュールを、アプリケーションとしてラップしたい場合がある.
stdlib などはライブラリアプリケーション.

ライブラリのときは、アプリケーションリソースファイルから、 {mod, {Module, Args}} を削除する.

参考リンク

参考文献