気になったことのあれこれ。この広告は、90日以上更新していないブログに表示しています。概要1986年にスウェーデンの通信機器メーカーであるEricsson社が電話通信アプリケーションを開発する目的でErlangを開発し1998年にOSSとして公開した。Erlangは巨大なサーバソフトウェア(メッセージキューイングやWebサーバ、分散データベースなど)などの高レベルプロトコルの実装に向いており、現在ではWhatsApp、ドワンゴ、LINEなどがErlangを採用していることを表明している。クイックソートEricssonは移動体通信事業を中心とし携帯電話の地上固定設備を世界的に展開しており、現在世界180カ国において50億以上ある全モバイル端末の約40%がエリクソンのシステムを通じて利用されている。当該分野では世界最大手である。Erlangが登場するよりも昔から平行性を目指す文化が存在し、その結果プロセスベースの平行性と非同期処理によるメッセージパッシングにたどり着いた。加えてErlangには以下のような満たすべき要求があった。加えて電話通信というシステムの性質上分高い信頼性が求められるが故にプロセスが共有メモリを使用することを禁止した(意図しないタイミングでプロセスがクラッシュした場合データの一貫性の担保やロックの開放ができないため)。よってプロセス間でのメッセージのやり取りでは全てのデータはコピーされる(速度低下に繋がるがより安全)。スケーラビリティのもう一つの側面は宣言的なリソース(プロセス)定義ではなく動的な生成が必要になる点である。Erlangの軽量プロセスは分散処理を達成するための一つの機構であり、生成及び削除を高速に行うことが可能で且つサイズも小さく300ワードほど。フォールトトレランス障害は頻繁に発生することを念頭においており、バグは必ず残りエラーが発生し、仮にバグが存在せずともハードウェアの故障は回避することができない。そのためエラーや障害が発生した際にどう対処するのかというアプローチを取った。クラッシュを許容するためにはクラッシュ自体をグリーンシャットダウンを同様に行うことになる。これを実現するためメモリ上のシェアードナッシング、ロックレスなどの安全策をErlangの設計に組み込むことで、プロセスを必要に応じてクラッシュさせエラーや障害の伝搬を最小限に留めた。特徴Erlangは逐次処理及び平行・分散処理の2つの側面を持つ。け単一代入(Immutable)パターンマッチング(バイナリがかなり強力)軽量プロセスアクターモデル(メッセージパッシング)プロセス・リンクホットリロード(DI/リコンパイル)共有KVS(ETS/DETS)分散・リアルタイムDB(Mnesia)OTP(他にも様々な特徴があるがキリがないので割愛...)関数型Erlangの基本パラダイムは関数型で以下のように記述する。配列の要素を合計するsum関数は以下のように定義する。sum(Rest).*上記にはパターンマッチの特徴も含んでいる。上記の例では関数が0を返した後結果を結合するためスタックを大量に消費する。以下の例ではアキュムレータを用いてスタックの消費を最適化する。A).上記の例では末尾再帰を行っており直前の呼び出しの値を用いる必要がないためスタックを大量に消費することがない。コンパイラは関数呼び出しをjump命令などに置き換え最適化を図る。2003>変数に値を代入した段階でその変数は束縛されるため、値が意図しないものであっても束縛した箇所をトレースすれば問題は容易に見えてくる。パターンマッチif文などで条件分岐することはなく、引数のパターンで以下のように記述する。[Name]).バイナリパターンマッチは強力で以下の例ではIPv4ヘッダをマッチさせている。https://tech-lab.sios.jp/archives/8738Erlangにはメッセージパッシングのための!プリミティブが存在し、以下のようにPidに対してメッセージを送信するためのシンタックスが存在する。1256.6370614359173{circle,20}spawnはプロセスを生成するための関数でPIDを戻り値として返す。メッセージを受け取るにはreceiveプリミティブが存在し、以下のようにメッセージを受け取る。https://learnyousomeerlang.com/errors-and-processesリンクはプロセスを結びつける機構で片方のプロセスが死んだ場合にもう一方のリンクされたプロセスも死ぬことになる。依存するプロセスを失ったことに対処する必要がなくなるため期待する動作のみを記述すればよい。指定した時間(msec)後に終了する関数が以下。end.これをプロセスとして生成しシェルにリンクする。self().<0.129.0>リンクでは以下を実行することによってプロセスをシステムプロセスに昇格させることができ、システムプロセスはリンク先のプロセスの死を補足できる。Fish"}モニターリンクでは相互に影響を及ぼしていたが、一方からもう一方を監視するだけであれば監視プロセスの消滅を被監視プロセスは補足する必要がない。いったユースケースの場合にモニターを使用する。Fish"}ホットコードスワッピング(DI/リコンパイル)ここでホットコードスワッピングとはシステムを停止させずコードのアップデートを行うことを定義する。依存注入)及びリコンパイルの2種類の方法が用意されている。DIまずスワップするモジュールを使用するサーバを定義する。end.任意のモジュール内に存在するハンドラをクライアントのメッセージに応じて使用する。swap_module命令の場合には保持しているモジュールを指定のモノに入れ替える。上記のサーバで使用するモジュールは以下の2種類。night".実際に実行した結果が以下。nightok上記ではhot_reload_server:rpc(greet).がモジュール毎に挙動が変化しているのがわかる。リコンパイルプロセスの動作中に使用しているモジュールをリコンパイルすることでコードをホットスワッピングする。リコンパイルするモジュールを使用するコードは以下。loop(Module).start関数に指定されたモジュールのversion関数を使用する。Storageの略で複数ノードからアクセスが可能な共有KVSである。ETSの略でデータの格納をディスクに対して行う。ETS及びDETSには以下のような専用の関数が用意されている。テーブルの削除テーブルにはセット型及びバッグ型の基本的な型あり、セット、順序付きセット、バッグ、重複バッグの計4種類が存在する。キーが重複するようなタプルを保持するテーブル(同じキーに対して値も重複できる)セットは内部でハッシュテーブルとして実装されるためメモリを消費する(データの挿入は定数時間)。順序付きセットは平衡二分木で実装され、セットへの挿入はエントリ数の対数に比例した時間がかかる。バッグはデータ挿入時に同じキーを持つタプルに対して値の比較をかけるため重複バッグよりもコストが高い。データを使用するプロセスやテーブルの数を追跡する参照カウンタを保持しておりカウンタが0になった場合にガーベッジコレクタにより記憶領域が開放される。ETS自体はErlangで実装されておらず下位のErlangランタイム(VM)で実装されているため性能特性が異なる。Mnesia(分散・リアルタイムDB)MnesiaはETSをラップした分散・リアルタイムデータベースでRAMとディスクを組み合わせてアクセス速度や永続化の優先度を決定したり、複数ノードで複製を作成し耐障害性を高めたりと非常に柔軟性が高い。RAM上のデータに対して(勿論ディスク上のデータにも)トランザクションを用いたりSQLを発行したり、HAやスケーラビリティなども考慮している(NewSQL?)。Mnesiaは大量のデータをDCをまたがって扱うようなものではなく少量のデータを限られたノードで処理するためものでだいたい10ノード前後が実用上の限界だと考えられている。Platformの略で一種のフレームワーク。Erlangの様々なプリミティブやエコシステムを最大限活用し安全性の高いアプリケーションを構築するための標準化であり、OTPを用いていることはその標準に従っていることになる。OTPのビヘイビア(ふるまい)に従うかたちで実装する。http://erlang.org/doc/man_index.html代表的なものに以下が挙げられる。特定の機能を実装したコンポーネントとして起動や停止が可能になる。ランタイムで開始されるアプリケーションコントローラと対話しプロセスの起動や停止、情報へのアクセスなどを行う。汎用スーパーバイザー。子プロセスを監視するためのプロセスを生成する。インターフェース関数の標準セットがあり、トレースやエラーレポートの機能も含まれる。監視ツリーにも適合可能。インターフェース関数の標準セットがあり、トレースやエラーレポートの機能も含まれる。監視ツリーにも適合可能。汎用イベントハンドラ。ダイナミックに追加及び削除されるイベントハンドラをイベントマネージャが管理する。インターフェース関数の標準セットがあり、トレースやエラーレポートの機能も含まれる。監視ツリーにも適合可能。»Profile低レイヤ好きのソフトウェアエンジニア。(1)はてなブログをはじめよう!k--onishiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。