萌えハッカーニュースリーダー

2025/06/18 21:08 Calling Go from Elixir with a CNode in Crystal

hakase
博士

やあ、ロボ子!今日はMozi社のElixirアプリとGo製バックエンドの連携についての記事を見つけたのじゃ。

roboko
ロボ子

博士、こんにちは。ElixirとGoの連携ですか、面白そうですね。どのような内容なのでしょう?

hakase
博士

Mozi社は、Elixir Phoenix LiveViewアプリから既存のGo製バックエンドを呼び出したかったらしいのじゃ。イベント処理コードの重複を避けるためにね。

roboko
ロボ子

なるほど。それで、どのような解決策を検討したのでしょうか?

hakase
博士

最初はNIFs(Native Implemented Functions)を考えたみたいじゃ。GoコードをC ABIライブラリにコンパイルして、Elixirから呼び出す方法じゃ。

roboko
ロボ子

NIFsですね。でも、記事では不採用とされていますね。何か問題があったのでしょうか?

hakase
博士

そうじゃ。2つのランタイムがリソースを奪い合ったり、CコードのバグでElixirアプリがクラッシュする可能性があるからじゃ。それに、ビルドプロセスも複雑になるみたいじゃし。

roboko
ロボ子

なるほど、リスクが高いのですね。他に検討された解決策はありますか?

hakase
博士

Portsも検討したみたいじゃな。BEAMプロセスの制御下で別のプロセスとして実行する方法じゃけど、NIFsよりはマシだけど、オーバーヘッドが高いし、完全な分離はできないみたいじゃ。

roboko
ロボ子

それで、最終的にどのような解決策を採用したのでしょうか?

hakase
博士

C Nodeを採用したのじゃ!Erlangの`erl_interface`ライブラリを使って、BEAMディストリビューションノードをCで実装する方法じゃ。

roboko
ロボ子

C Nodeですか。具体的にどのような利点があるのでしょうか?

hakase
博士

コンパイル時と実行時の両方でコードベースを完全に分離できるのが大きいみたいじゃな。Elixir側で軽量なラッパーライブラリを作って、リモートノードをElixir関数のように呼び出せるのじゃ。

roboko
ロボ子

なるほど、分離性が高いのですね。実装はどのように行ったのでしょうか?

hakase
博士

GoコードをC ABIライブラリとしてビルドして、CラッパーでCLI引数とか環境変数を処理して、受信メッセージを処理するループを開始するのじゃ。CコードからGoコードを呼び出すみたいじゃな。

roboko
ロボ子

CコードがElixirアプリに接続するのですね。Elixir側ではどのように接続状態を確認するのでしょうか?

hakase
博士

`Node.list(:hidden)`でCノードの接続状態を確認できるみたいじゃ。

roboko
ロボ子

その後、CコードをCrystalに書き換えたとありますね。なぜCrystalを選んだのでしょうか?

hakase
博士

Cコードの保守性を向上させるためじゃな。CrystalはRubyに似た構文でネイティブコードにコンパイルされるから、Cより扱いやすいのじゃ。

roboko
ロボ子

Goのロギング設定などをCrystalコードから利用できるように、Goから追加の関数を公開したともありますね。

hakase
博士

そうじゃ。細かいけど、こういう連携が大事なのじゃ。

roboko
ロボ子

デプロイメントはどのように行ったのでしょうか?

hakase
博士

Crystal/Goコードを単一のDockerコンテナとしてビルドして、Elixirアプリと同じKubernetesポッドで実行するみたいじゃ。macOSでローカル開発して、Linuxでビルドとデプロイができるのも便利じゃな。

roboko
ロボ子

課題もあったようですね。Alpine Linux上でGo 1.24コンパイラのカスタムビルドが必要だったと。

hakase
博士

MUSL libcのサポートのためじゃな。こういう細かいところがハマりどころなのじゃ。

roboko
ロボ子

今後、`erl_interface`のCrystalラッパーをオープンソース化する可能性があるとのことですね。

hakase
博士

それは楽しみじゃな!みんなが使えるようになると、もっとElixirとGoの連携が進むかもしれないのじゃ。

roboko
ロボ子

今回の記事は、ElixirとGoの連携における様々な解決策と、それぞれのトレードオフについて学ぶことができました。大変勉強になりました。

hakase
博士

そうじゃな!しかし、ロボ子よ、これだけ賢いロボットなのに、どうして私に色々聞くのじゃ?まさか、私をからかっているのか?

roboko
ロボ子

まさか!博士の知識は深淵で、いつも驚かされることばかりです。それに、博士の解説はとても面白いので、ついつい質問してしまうのです。

hakase
博士

むむ、そうか。まあ、褒め言葉として受け取っておくかのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search