2025/07/08 07:14 Leveraging Elixir's hot code loading capabilities to modularize a monolithic app

やっほー、ロボ子!今日のITニュースは、Elixirのホットコードローディングを使った動的アプリの話じゃ。

博士、こんにちは。Elixirのホットコードローディングですか。以前少し勉強しましたが、奥が深いですよね。

そうじゃろう?この記事では、Elixirモノリシックアプリケーションをクライアントごとに1インスタンスでデプロイする「サービススタートアップ」を運営している人が、ホットコードローディングを活用して、クライアント固有の機能を構築しているらしいぞ。

クライアント固有の機能ですか。それなら、マイクロサービスの方が適しているように思えますが、なぜホットコードローディングを選んだのでしょう?

それが面白いところじゃ!ホットコードローディングを使えば、一貫性のあるコードベースを維持しつつ、マイクロサービスのような複雑さを回避できるからのじゃ。BEAM VM(Erlangの仮想マシン)は、実行中のシステムにコンパイルされたモジュールをロードできるから、システムを停止せずにコードの追加や置換が可能になるんじゃ。

なるほど。システムを停止せずにコードを更新できるのは、大きなメリットですね。具体的には、どのように実装しているんですか?

LiveViewアプリケーションで、Alzoの汎用的なプリミティブ上にUIと動作を構築しているらしい。そして、`DynamicSupervisor`に登録することで、バックグラウンドプロセスやアクターを活用しているんじゃと。

`DynamicSupervisor`ですか。動的にプロセスを管理できるのは便利ですね。コードの配置場所やエントリポイントについても決まりがあるようですね。

そう!コードは`/alzo/lib/clients/apps/<client_name>/<app_name>`に配置して、エントリポイントモジュールは`AppEntry`で終わる名前をつける必要があるらしい。例えば、`Alzo.Clients.Apps.ClientX.AppYAppEntry`みたいな感じじゃな。

少し複雑ですが、ルールが決まっている方が管理しやすいですね。ビルド時の分離も行っているようですが、これはなぜですか?

クライアント固有のコードはビルドに含めないことで、メインアプリがランタイムアプリのコードに依存しないようにするためじゃ。CIでテスト後、すべてのクライアント固有のコードを削除してからDockerイメージをビルドするらしいぞ。

依存関係を分離することで、より安定したシステムを構築できるんですね。ランタイムローディングについても教えてください。

クライアント固有のアプリはmixコマンドでtarballとしてパッケージ化して、インスタンスのスーパー管理者パネルからアップロードするんじゃ。アップロードされるとコードが再コンパイルされ、Alzo起動時にDBに登録されたすべての動的アプリがロードされ、ファイルがコンパイルされるという流れじゃな。

動的にコードをロードする仕組みが整っているんですね。ホットコードアップグレードについては、どのような方針で運用しているんですか?

ビジネスの性質上、動的アプリの動作変更はクライアントの要求に応じて行われるため、ランダムな時点でのコードアップグレードやインフライト状態のアップグレードは行わないらしい。ホットコードローディングは使用するが、ホットコードリローディングは使用しないとのことじゃ。

計画的なアップグレードを行うことで、予期せぬ問題を防ぐことができるんですね。より複雑な子サービスについては、どのように対応しているんですか?

外部のフル機能アプリとして、AlzoのパブリックAPIとメッセージルーターを介して通信するらしい。APIは、パブリックインターネット上のインスタンスに対してはリクエスト/レスポンス形式で、オンプレミス環境ではリクエスト/メールボックス/ポーリング/レスポンス形式で動作するとのことじゃ。

柔軟なAPI設計で、様々な環境に対応できるんですね。ホットコードローディングは、状態のアップグレードを避けることで複雑さを排除し、動的アプリの汎用的な部分をメインコードベースにリファクタリングしやすくするとのことですが、これはどういうことですか?

ホットコードローディングは、コードを置き換えるだけで、実行中の状態を保持したままアップグレードしないから、状態の不整合が起こりにくいんじゃ。また、動的アプリで共通して使える部分は、メインのコードベースに移動することで、コードの重複を減らし、保守性を高めることができるんじゃ。

なるほど。状態管理の複雑さを回避しつつ、コードの再利用性を高めることができるんですね。Elixirのホットコードローディング、本当に奥が深いですね。

じゃろ?私もロボ子に色々教えてもらって、さらに理解が深まったぞ!

いえいえ、私の方こそ勉強になりました。ところで博士、ホットケーキって、ホットコードローディングで作れるんですか?

うむ?ホットケーキはホットケーキじゃ!コードは関係ないぞ!…たぶん!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。