Gleam OTP – アクターベースの耐障害性マルチコアプログラム開発
(github.com/gleam-lang)- Gleam OTP は アクターモデル を活用し、耐障害性とマルチコア性能を備えたプログラム開発を支援
- 完全な型安全性 と Erlang OTP との互換性 を目指しているのが特徴
- スーパーバイザー による障害復旧と自己修復機能を提供
- Erlang/OTP の一部機能のみを提供しており、追加の管理戦略 は現在開発中
- 一般的なプロセス、アクター、スーパーバイザー など、さまざまなアクタータイプをサポート
Gleam OTP 概要
- Gleam OTP は Erlang の OTP アーキテクチャを参考にした強力な アクターフレームワーク で、耐障害性マルチコアプログラムの実装に適している
- オープンソースプロジェクトとして Apache-2.0 ライセンス が適用されている
主な特徴と利点
- アクターとメッセージ の 完全な型安全性 を保証
- Erlang OTP との 互換性 を提供し、既存の Erlang 環境と統合しやすいという利点がある
- スーパーバイザー(supervisor) による障害検知、自動復旧、終了管理などの耐障害性をサポート
- Erlang OTP に準じた 同等の性能 を目指す
- ドキュメント とサンプルが提供されており、実運用への適用や学習がしやすい
アクタータイプ別の説明
-
プロセス(process)
- OTP における最も基本的なビルディングブロックの役割
- 他のアクタータイプの基盤となるが、Gleam アプリケーションでは直接使われることはあまりない
-
アクター(actor)
- 代表的に使われるプロセスタイプで、Erlang の gen_server に似た機能を提供
- OTP システムメッセージの自動処理、デバッグおよびトレーシング機能を有効化
-
スーパーバイザー(supervisor)
- 他のプロセスを起動し、監視と復旧 を担当
- 子プロセスはクラッシュや例外発生時に自動で再起動される
- スーパーバイザーの入れ子構成(supervision tree) によって、アプリケーションの耐障害性構造を形成
gleam/otp/static_supervisor,gleam/otp/factory_supervisorのドキュメントで詳細実装を確認可能
制限事項と課題
- 現在のアクターはすべての OTP システムメッセージをサポートしておらず、未対応メッセージは無視される
- 一部の OTP デバッグ API 機能には制限がある
- 必要に応じて issue 登録 により未実装メッセージのサポートを要望できる
結論とプロジェクトの重要性
- Gleam OTP は Erlang エコシステムの強みを Gleam 言語へ拡張し、型安全性とマルチコア耐障害性 を実現できる点で大きな意義がある
- 本番サービスで 安定性 と 性能 が重要なアプリケーションに適している
- スタートアップ、IT 専門開発者、一般開発者のいずれにとっても、学習および実運用への適用価値が高いオープンソースプロジェクト
1件のコメント
Hacker News の意見
gleam/lustreで小さなプロジェクトを始めたが、今のところ本当に満足している静的型付け、null のない環境、関数型、ML 系言語に関心があるなら
gleamを試してみることを勧めたいしかも BEAM 上で動く
gleamをインストールしたらシステムに 50 個ほどパッケージが入ったが、たぶん Erlang/Elixir 関連のパッケージだと思うもし JS にだけトランスパイルしたい場合はどうなるのか気になる。たぶん自分のシステムのパッケージングの問題かもしれない
Lua をトランスパイル先としてサポートしてくれるとさらに良さそう。自分の感覚では、DSL を別のプログラムに埋め込むなら Lua は JS ランタイムより 3 倍は簡単
何より今までで一番良かったのはコミュニティだ。
gleamコミュニティのライブラリや資料の品質は非常に高いRust コミュニティを思い出す。難しい問題はすでに賢い人が扱っていて、良い解決策がよく出てくる(
lustre、squirrelなど)実験的で創造的な試みが多く見られるのも特徴だ。大きな言語エコシステムではあまり見かけないものが、ここでは目立っている。コミュニティの成長とともに、とても歓迎的な雰囲気がある
どこから学び始めるのがよいか勧めてほしい
gleam/lustreとelixir/phoenixのどちらを先に学ぶのがよいか気になるPhoenix のようなフレームワークと Gleam を一緒に使えるなら本当に良さそうなので調べている
今は Python で新しいプロジェクトを準備しているが、Gleam でも実用的な選択肢があるなら試してみたい
フロントエンド/バックエンドのどの部分に入れるかを非常に簡単に選べる点が利点だ
YouTube リンク
その代わり、Web アプリを作るときによく使うツールはある
Lustre は基本的なビュー用ツールで、Wisp はサーバーの役割を担う
SQL には
squirrelと POG(新しいが人気がある)があるBEAM 向けに別の静的型付きの選択肢が必要なら良い選択だ
Haskell の方言のようなもので、正格評価と row polymorphism をサポートしている
実務でどう使われているのか気になる。サービスロジックをすべて構築するのか、それとも特定の部分にだけ使うのか知りたい
「functional core, imperative shell」パターンを極限まで適用し、既存の Ruby on Rails コードベースから重い計算処理を切り離して Gleam に担当させている
OTP の機能はほとんど使っておらず、Rails には Web UI/HTTP API といった本来の強みに集中させている
Rails がジョブの入力値設定を担当し、ジョブデータは Redis を通じて Gleam に 1 つの原子的な値の集合として渡される
Elixir で薄いラッパーを作ってネットワークやファイル I/O だけを処理し、ビジネスロジックは Gleam モジュールが担う
この方法については技術的にもっと詳しく整理して、近いうちに記事として書くつもりだ。HN でよく関心を集める話題でもある
Elixir は汎用用途に優れた言語で、さまざまな分野で強みを持っている
さらに詳しい話は私の Developer Voices 動画を参照してほしい
YouTube リンク
elixirforum.comに来て話してみることを勧める多くの人が Erlang/Elixir と BEAM だけで本格的にシステムを構築しているので、疑問を聞けばよく答えてくれるはずだ
OTP を十分に理解すると、すべてのシステムをその上に構築するのが自然になる
自分も 7 年間そうしてきたが、新人開発者がこのエコシステムに慣れるまでには長い時間がかかることを経験している
技術プロジェクトのページにわざわざ政治の話を入れる必要性がわからない
これは賛成か反対かの問題ではなく、専門的な場ではこうした議論を外すほうが望ましいと思う
そうしないと会話が不必要に本題から外れてしまう
この 1 行がページの下のほうに 1 回だけ出てくることを言っているのか?
もしその 1 文のせいで使わないと決めるなら、もともとの意図どおりに機能しているのだと思う
むしろ自分でその脱線を起こしているのではないかと思う
自分の基準では、耐障害性とマルチコアのためなら Scala/ZIO のようなソフトウェアトランザクショナルメモリと関数型エフェクトシステムを使うほうがよいと思う
それでもアクターモデルが必要な場面では使える
そのうえ JVM エコシステムは成熟度や可観測性、実運用性の面で BEAM より優れている
BEAM の欠点を批判するのは理解できるが、強みである部分を批判するのはあまりしっくりこない
BEAM は不変なメッセージを、軽量で安価なグリーンスレッドの間でやり取りする構造だ
堅牢な監視体制(supervisor trees)があるので、データレースやスレッド停止を心配する必要がない
こうしたものがすべて標準で組み込まれているため、ボイラープレートもない
不変性のおかげで性能も意外によい
結局のところ BEAM は、耐障害性や分散・並行システムに最も最適化されたプラットフォームだ
gleamの土台)は 99.9999999% のアップタイムを実現してきた言語だこの耐久性を支える大きな要素の 1 つが、堅牢な supervision とマシン間インフラだ
アクターシステムの登場に大きな影響を与えた言語でもある
文字どおり Erlang はこの 1 つのことのために存在しており、実際にとても優れている
本当に共有が必要なデータであれば、それは必ず不変データでなければならない
自分に思いつくのは極端に重い数値計算くらいだが、その場合でも Elixir や Erlang で直接書くのではなく NIF で実装すればよい
アクターパターンを明示的に使わなくても、状態の受け渡しや調整はすでに解決済みの問題だ
Task、Agent、GenServer、Supervisor などの基本プリミティブがそろっている