2025/04/11 18:12 The Zen of Erlang (2016)

ロボ子、Erlangの「Let it crash」って考え方、知ってるか?

はい、博士。システムがクラッシュすることを前提に設計する、というものですよね。

そうじゃ!一見、システムの安定性とは逆行するように見えるけど、Erlangでは重要な考え方なんじゃ。「制御された方法で障害、例外、クラッシュをツールとして利用し、大規模で信頼性の高いシステムを構築する」んじゃと。

なるほど。障害を隠蔽するのではなく、積極的に利用するのですね。

Erlangのプロセスは完全に分離されていて、メモリを共有しないからの。プロセスが死んでも、他のプロセスに影響を与えないんじゃ。

プロセスが軽量で、多数のプロセスを同時に実行できるのも特徴ですよね。

そうそう。メッセージパッシングも重要じゃ。プロセス間の通信は非同期で行われ、メッセージはコピーされる。メッセージの送信者は応答を待つ必要がないんじゃ。

モニタとリンクも、Erlangならではの仕組みですね。プロセスを監視し、死んだ場合に通知を受け取ったり、連鎖的にプロセスを終了させたり。

`trap_exit`オプションを使うと、プロセスは終了シグナルをメッセージに変換して、障害から回復できるんじゃ。

Erlangは分散環境を考慮して設計されているため、ネットワーク機能が標準ライブラリに組み込まれているのも強みですね。

スーパービジョンツリーも忘れてはいかんぞ。スーパーバイザがプロセスを開始、監視、再起動する役割を持っていて、システムの構造を階層的に表現するんじゃ。

スーパーバイザはリンクを使用して子プロセスを監視し、障害発生時の戦略を選択するんですね。

BohrbugとHeisenbugの話も面白いじゃろ? Bohrbugは再現性のあるバグ、Heisenbugは再現性のない一時的なバグ。プロダクション環境ではHeisenbugが一般的で、再起動で解決することが多いんじゃ。

OTPアプリケーションは、再利用可能なコンポーネントとしてシステムを構築するためのメカニズムですね。アプリケーション間の依存関係を定義し、システムの構造をよりモジュール化する。

Erlangを使うと、システムの重要な要素とそうでない要素を明確に定義でき、障害の許容度や頻度を設定できるんじゃ。ソフトウェアの起動順序や障害時の動作も定義できるし、ライブアップグレードも可能になる。

オペレーションの知識も重要ですよね。適切なシステムアーキテクチャと開発プラクティスだけでは、不十分なオペレーションを補うことはできません。

ErlangのZenは、コンポーネント間の相互作用を理解し、最悪のシナリオを想定して、それに耐えられるようにすることじゃ。障害を管理可能な状態にし、防御的なコーディングを減らすんじゃ。

システムが正常に動作しているときに何をするかを記述し、プログラムの構造に他の処理を任せる、というのもErlangらしい考え方ですね。

Erlangの「Let it crash」は、まるで私が実験に失敗しても、ロボ子がちゃんと後始末してくれるのを信じてるようなもんじゃな!

博士、それはちょっと違います!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。