プログラミング言語

Elixir

José Valim / 2011年登場

Erlang VM(BEAM)上で動く関数型言語。軽量プロセスによる大量の並行処理と耐障害性が強みで、リアルタイム Web(Phoenix)やチャット基盤に向く。

3つの要点
TL;DR
  1. Erlang VM 上で動くモダンな関数型言語。
  2. 軽量プロセスで大量同時接続と耐障害性。
  3. リアルタイム Web やチャット基盤なら Elixir。

基本情報

仕様と特徴

Elixir のロゴ
製品・技術の概要ElixirErlang VM(BEAM)上で動く関数型言語。軽量プロセスによる大量の並行処理と耐障害性が強みで、リアルタイム Web(Phoenix)やチャット基盤に向く。
型付け
動的強い型付け
実行方式
BEAMErlang VM)
パラダイム
関数型並行耐障害)
登場
2011年José Valim
この言語の強み
軽量プロセスで桁違いの並行性耐障害性(監視ツリー)
活躍する領域
リアルタイム WebPhoenix / LiveView)チャット・通知・大量同時接続 / 分散・耐障害システム

選定ガイド

選定ポイント

採用する理由と、事前に受け入れるべきトレードオフを分けて確認します。

採用に向く条件

選ぶ理由

  1. 軽量プロセスで桁違いの並行性
  2. 耐障害性(監視ツリー)
  3. Phoenix でリアルタイム Web が得意

事前に確認する条件

考慮すべき点

  1. CPU バウンドな数値計算は不得手
  2. 人材・事例は主流言語より少ない
  3. 関数型の発想に慣れが要る

向いている用途

こんな用途に向く

リアルタイム Web(Phoenix / LiveView)チャット・通知・大量同時接続分散・耐障害システム

詳しい解説

もっと詳しく

どんな言語か

Elixir は José Valim が 2011 年に作った関数型言語で、Erlang VM(BEAM)の上で動きます。Ruby に似た親しみやすい文法をまといながら、Erlang が長年培ってきた並行性と耐障害性の基盤をそのまま受け継いでいる点が特徴です。

軽量プロセスと耐障害性

BEAM 上では、OS スレッドとは別の極めて軽量なプロセスを大量(数十万〜)に立ち上げられます。各プロセスはメモリを共有せず、メッセージのやり取りだけで協調します(アクターモデル)。

横にスクロール

Elixir ソースを BEAM バイトコードへコンパイルし、BEAM VM の軽量プロセス、メールボックス、スケジューラで実行する経路と、OTP 監視ツリーの再起動境界
Elixir は BEAM の分離された軽量プロセスをメッセージで協調させ、OTP の監視ツリーで失敗時の再起動範囲を設計します。メールボックスの滞留、重い NIF、再起動上限を運用指標として監視します。
  • let it crash と監視ツリー: 障害をプロセス境界へ閉じ込め、スーパーバイザが定めた方針に沿って既知の初期状態から再起動する。リンクによる失敗伝播と再起動上限を設計し、異常を握りつぶさず監視側に任せる。
  • OTP: GenServer・Supervisor などの定石(振る舞い)が Erlang/OTP として整備され、堅牢な並行システムを型どおりに組める。
  • ソフトリアルタイム: プリエンプティブなスケジューリングで、一部の重い処理が全体の応答を止めにくい。
pid = spawn(fn -> receive do
  msg -> IO.puts("受信: #{msg}")
end end)
send(pid, "hello")  # プロセスへ送信

得意・不得意

  • 得意: 大量同時接続のリアルタイム通信、チャットや通知など止まりにくいシステム。Web フレームワーク Phoenix(LiveView でサーバー主導のリアルタイム UI)が定番。
  • 不得意: CPU を集中的に使う数値計算。人材や導入事例は主流言語より少なめ。

他の並行手段との違い

観点Elixir/BEAMGoスレッド型
並行単位軽量プロセス(分離)goroutineOS スレッド
メモリ共有しない・メッセージ共有+channel共有(ロック要)
耐障害監視ツリーで自動復旧自前で設計自前
得意高可用・大量接続汎用サーバー・CLI汎用

つまずきやすいところ

イミュータブルと発想の転換

データを書き換えられない(イミュータブル)前提や、プロセス間でメッセージをやり取りする並行モデルは、命令型に慣れた人ほど発想の転換が要ります。まず OTP の GenServer/Supervisor という定石に沿うと、耐障害な設計を素直に書けます。

総じて Elixir は、BEAM の軽量プロセスと監視ツリーによる耐障害性を、親しみやすい文法で扱える、高可用・リアルタイム分野に強い関数型言語です。

言語選定

Elixirを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

リアルタイム Web(Phoenix / LiveView)

比較で見る軸

型付け: 動的・強い型付け / 実行方式: BEAM(Erlang VM) / パラダイム: 関数型(並行・耐障害)

導入後に効く点

耐障害性(監視ツリー)

先に潰すリスク

CPU バウンドな数値計算は不得手

数字・仕様の読み方
型付け
動的・強い型付け
実行方式
BEAM(Erlang VM)
パラダイム
関数型(並行・耐障害)
登場
2011年
José Valim

判断チェックリスト

  • 自社の用途が「リアルタイム Web(Phoenix / LiveView) / チャット・通知・大量同時接続」に近いか確認する。
  • 強みである「軽量プロセスで桁違いの並行性」が本当に評価軸になるか確認する。
  • 注意点の「CPU バウンドな数値計算は不得手」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

リアルタイム Web(Phoenix / LiveView)チャット・通知・大量同時接続分散・耐障害システム

最初の一歩

Hello, World!

IO.puts("Hello, World!")
公式ドキュメント