- Erlangエコシステムの強力な機能の1つがホットコードアップデート
- この機能はほかのランタイムではほぼ不可能で、非常にユニーク
- ElixirはErlang上に構築されており、同じ機能をサポートする
Elixirでホットコードアップデートを適用
- 標準的なElixirリリース(
mix release)方式は、デフォルトではErlangのホットコードアップデートをサポートしていない
- ホットコードアップデートを実装するには、いくつかのブログ記事を参照するか、Erlang公式ドキュメントを詳細に調べる必要がある
- 関連資料:
ホットコードアップデートの実際の活用事例
- ホットコードアップデートは実務では大きく2つに分けられる:
- シンプルなコードリロード
- 例: 開発中に
IExでr MyModuleまたはrecompileコマンドを実行すること
- これは簡単で便利だが、新しいコンパイラやビルダーの一部のようにも感じられる
- より複雑な応用
- Nervesプロジェクトでホットコードアップデートをよく活用:
- 組み込みElixirデバイスで数値を調整したりモジュールを修正したりするとき、ファームウェアのアップロードと再起動を待つ代わりに
IExで更新
- アプリケーションの特定部分を起動・停止したり、
GenServerを終了して状態を初期化
- NervesHubを通じてリモートデバイスにホットコードアップデートを適用:
- 例: リアルタイムクロックのデバッグ時にI2C呼び出しを直接実行し、問題を素早く把握
ホットコードアップデートのツールと注意点
- Elixirの
mix releaseや既存のdistilleryツールの上でホットコードアップデートをサポートするツーリングが増えることを期待
- ホットコードアップデートはデータベースマイグレーションのように細心の注意が必要:
- 依存関係がホットコードアップデートにどう反応するかを理解する必要がある
- そのほかにも考慮すべきさまざまなトピックがある
3件のコメント
この内容は、国内唯一のElixir翻訳書である『はじめて学ぶElixirプログラミング』にも詳しく掲載されています。
すばらしく強力な機能ではありますが、
リアルタイムのデバッグや確認用途にのみ使うのがよさそうです
Hacker Newsの意見
Discordでは BEAM のホットコードローディングを使って長いデプロイサイクルを短縮し、緊急アップデートに活用していた
Nerves デバイスではコードリロードが有用で、リアルタイムに修正をテストできるため統合テストに向いている
/tmpにコピーした後でCode.compileを使うと、より良いエラーメッセージが得られるElixir プロジェクトではホットコードアップデートを使えなかったが、顧客の助けになったはずだと考えている
kosmi.io ではホットコードアップグレードをうまく活用している
Nerves とホットコードリロードを通じて Erlang に興味を持つようになった
relup の準備時には細心の注意が必要で、Linux では新しいサーバーを起動してセッションデータを転送する方法もある
Elixir を組み込み Linux にデプロイしており、Nerves が systemd を置き換えて BEAM VM をプロセス 1 として起動する
WhatsApp は過去に SSH スクリプトを使って全ノードでホットリロードを行っていた
ホットコードアップデートは有用だが、ミスを招きやすく、サポートも不十分である
ホットコードアップデートは、多数のクライアントが接続している状況でコード変更を行う際に有利である