12 ポイント 投稿者 GN⁺ 2024-11-21 | 3件のコメント | WhatsAppで共有
  • Erlangエコシステムの強力な機能の1つがホットコードアップデート
  • この機能はほかのランタイムではほぼ不可能で、非常にユニーク
  • ElixirはErlang上に構築されており、同じ機能をサポートする

Elixirでホットコードアップデートを適用

  • 標準的なElixirリリース(mix release)方式は、デフォルトではErlangのホットコードアップデートをサポートしていない
  • ホットコードアップデートを実装するには、いくつかのブログ記事を参照するか、Erlang公式ドキュメントを詳細に調べる必要がある
  • 関連資料:

ホットコードアップデートの実際の活用事例

  • ホットコードアップデートは実務では大きく2つに分けられる:
    1. シンプルなコードリロード
      • 例: 開発中にIExr MyModuleまたはrecompileコマンドを実行すること
      • これは簡単で便利だが、新しいコンパイラやビルダーの一部のようにも感じられる
    2. より複雑な応用
      • Nervesプロジェクトでホットコードアップデートをよく活用:
        • 組み込みElixirデバイスで数値を調整したりモジュールを修正したりするとき、ファームウェアのアップロードと再起動を待つ代わりにIExで更新
        • アプリケーションの特定部分を起動・停止したり、GenServerを終了して状態を初期化
      • NervesHubを通じてリモートデバイスにホットコードアップデートを適用:
        • 例: リアルタイムクロックのデバッグ時にI2C呼び出しを直接実行し、問題を素早く把握

ホットコードアップデートのツールと注意点

  • Elixirのmix releaseや既存のdistilleryツールの上でホットコードアップデートをサポートするツーリングが増えることを期待
  • ホットコードアップデートはデータベースマイグレーションのように細心の注意が必要:
    • 依存関係がホットコードアップデートにどう反応するかを理解する必要がある
    • そのほかにも考慮すべきさまざまなトピックがある

3件のコメント

 
bus710 2024-11-22

この内容は、国内唯一のElixir翻訳書である『はじめて学ぶElixirプログラミング』にも詳しく掲載されています。

 
papillon 2024-11-21

すばらしく強力な機能ではありますが、
リアルタイムのデバッグや確認用途にのみ使うのがよさそうです

 
GN⁺ 2024-11-21
Hacker Newsの意見
  • Discordでは BEAM のホットコードローディングを使って長いデプロイサイクルを短縮し、緊急アップデートに活用していた

    • 複数モジュールを同時にパッチできるツールを開発し、クラスターにアップデートを伝播させていた
    • Erlang の組み込み分散機能を通じてホットパッチを配布していた
  • Nerves デバイスではコードリロードが有用で、リアルタイムに修正をテストできるため統合テストに向いている

    • リモートで新しいファームウェアをテストして更新し、顧客を満足させた
    • ファイルを /tmp にコピーした後で Code.compile を使うと、より良いエラーメッセージが得られる
    • すべてのコードをコンパイルして削除するヘルパー関数を書くのは簡単である
  • Elixir プロジェクトではホットコードアップデートを使えなかったが、顧客の助けになったはずだと考えている

    • 複雑な変更ではホットコードアップデートがかえって問題を増やす可能性がある
    • 単純な変更では影響を最小限に抑えるのがよい
  • kosmi.io ではホットコードアップグレードをうまく活用している

    • 迅速な開発、修正、アップデートの配布が可能になる
    • Distillery とカスタムスクリプトを使っているが、標準化されていてほしい
  • Nerves とホットコードリロードを通じて Erlang に興味を持つようになった

    • 本番環境では実用的ではないが、信頼できるシステム構築に役立つツールである
  • relup の準備時には細心の注意が必要で、Linux では新しいサーバーを起動してセッションデータを転送する方法もある

    • ホットパッチングは同じ VM を動かし続けるため、満足できない場合がある
  • Elixir を組み込み Linux にデプロイしており、Nerves が systemd を置き換えて BEAM VM をプロセス 1 として起動する

    • Elixir をハードウェアにより近い位置に配置している
  • WhatsApp は過去に SSH スクリプトを使って全ノードでホットリロードを行っていた

  • ホットコードアップデートは有用だが、ミスを招きやすく、サポートも不十分である

    • ホットコードアップデートの利点は、慎重なローリング再起動によっても得られる
    • Erlang のコードリロード機能を活用して、リアルタイムの問題診断ツールを作ることができる
  • ホットコードアップデートは、多数のクライアントが接続している状況でコード変更を行う際に有利である

    • GNU Make を使ってコードを本番環境に同期し、デバッグシェルを通じてモジュールをロードしていた