0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-25

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}} を削除する.

参考リンク

参考文献

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?