Skip to content

필사 모드: モダン Erlang と BEAM 2026 — OTP 27 / OTP 28 プレビュー / Cowboy 3 / Bandit / Khepri / Gleam / Nerves / AtomVM 徹底ガイド

日本語
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

プロローグ — なぜ 30 年もののバーチャルマシンが 2026 年でも魅力的なのか

1986 年。エリクソンの通信スイッチチームが新言語を作る。名前は Erlang。目的はただ一つ — **死なないシステム**。9 個の 9、つまり 99.9999999% の可用性を持つ電話交換機。

それから 40 年。2026 年の Erlang はもう通信会社の言語ではない。WhatsApp は 20 億人のメッセージを BEAM の上でさばき、Discord は数億人の音声・テキストを Elixir でルーティングし、Klarna は決済トランザクションを Erlang で処理している。RabbitMQ は事実上あらゆるマイクロサービスのバックボーンに敷かれ、Akamai の DNS は Erlang で動く。

> **BEAM は止まっていない。** 2024 年 5 月に OTP 27 が出て、OTP 28 がプレビューから安定版へ向かう。Cowboy 3 が HTTP/2 と WebSocket を再仕上げし、Bandit が純 Elixir で Cowboy の代替を示した。RabbitMQ チームは Mnesia 後継となる Khepri を Raft の上に作った。Gleam は静的型を引っ提げて BEAM エコシステムに合流、Nerves は組み込み、AtomVM は ESP32 マイコンまで侵入した。

この記事は 2026 年の BEAM エコシステムの **全体地図** である。OTP 27/28 の新機能、HTTP スタック、分散データ、組み込み、新しい言語、そして誰が実際に使っているか。

> 「Erlang は私たちに、より少ない人数でより多くのことをさせてくれた。」

> — Jan Koum、WhatsApp 共同創業者。50 人のエンジニアで 9 億ユーザーを運用していた頃。

第 1 章 · 2026 年の Erlang/BEAM 地図 — なぜ今も魅力的か

まず BEAM とは何か、なぜ他のバーチャルマシンと本質的に違うのかを整理する。

BEAM の 4 つの中核資産

1. **軽量プロセス(グリーンプロセス)** — OS スレッドではない。BEAM 内部の仮想プロセス。1 個あたり約 300 バイト。単一ノードで数百万個が起動できる。

2. **プリエンプティブスケジューラ** — Go の協調型スケジューラとは違う。BEAM はリダクションカウントで強制的にコンテキストスイッチをする。1 つのプロセスが無限ループを回しても、ほかのプロセスが餓死しない。

3. **share-nothing のメッセージパッシング** — プロセス間でメモリを共有しない。通信はすべてメッセージ。ロックがない。デッドロックのカテゴリ自体が消える。

4. **OTP (Open Telecom Platform)** — supervisor、gen_server、gen_statem のような振る舞い(behavior)。30 年検証された分散・耐障害ライブラリの標準集。

BEAM が輝く領域と輝かない領域

輝く 輝かない

──────────────────────── ────────────────────

大量の同時接続(数百万) 数値計算 (CPU バウンド)

リアルタイムメッセージング・チャット 単一スレッドのスループット

分散システム・クラスタリング 機械学習の学習(training)

長寿命の接続 (LiveView) デスクトップ GUI アプリ

障害耐性が必須のシステム システムプログラミング

プロトコルゲートウェイ (MQTT, AMQP) ゲームエンジン

要点: **CPU ではなく、同時実行性(concurrency)がボトルネックになる場所**。そして **死んではいけない場所**。

2026 年の BEAM エコシステム一枚絵

┌────────────────────────────────────────┐

│ BEAM VM │

│ (JIT, ETS, supervisor, OTP) │

└───────┬────────────────┬───────────────┘

│ │

┌─────────────┼───┐ ┌───────┼──────────┐

│ │ │ │ │ │

Erlang Elixir gleam Lustre Phoenix

│ │ │ (web) (LiveView)

│ │ │

▼ ▼ ▼

┌────────┐ ┌─────────┐ ┌─────────┐

│Cowboy 3│ │ Bandit │ │ AtomVM │

│ HTTP │ │(Plug用) │ │ (ESP32) │

└────────┘ └─────────┘ └─────────┘

ストレージ: Mnesia / Khepri (Raft) / ETS / DETS

分散: distributed Erlang / partisan

組み込み: Nerves (Linux) / AtomVM (MCU)

財団: Erlang Ecosystem Foundation (EEF)

以下、この地図の各部分を順に見ていく。

第 2 章 · Erlang/OTP 27 (2024 年 5 月) — 文字列補間と persistent_term の再発見

2024 年 5 月、Erlang/OTP 27 が正式リリースされた。2026 年現在、本番の大半は 27 へ移動中か既に移動済み。27 がもたらした、もっとも目立つ 3 つの変化。

2-1. トリプルクオート文字列 + 文字列補間

Erlang は 30 年間、文字列補間を持たなかった。2026 年でようやく追加された。しかも 2 形式で。

%% トリプルクオート (OTP 27)

Greeting = """

Hello, World!

Multi-line, no escaping needed.

""",

%% シジル形式 (~b は binary)

Name = <<"Alice">>,

Greeting2 = ~b"Hello, #{Name}!".

%% => <<"Hello, Alice!">>

`~b` シジルで補間ありのバイナリ文字列、`~B` で補間なしのバイナリ。Elixir の `~s`、`~S` に近い設計。

> **現実:** Erlang ユーザーは 30 年間 `io_lib:format("Hello, ~p!", [Name])` を書いてきた。これからは `~b"Hello, #{Name}!"` で済む。コードがはるかに読みやすくなる。

2-2. set_node_lookup_node / ノード探索の改善

分散 Erlang クラスタのノード探索は EPMD (Erlang Port Mapper Daemon) に依存していた。OTP 27 では、EPMD を迂回してノード名を直接登録できるコールバック API を正式化した。

- コンテナ環境(Kubernetes)で EPMD が邪魔だった問題を解消。

- libcluster のようなライブラリは既に近いことをやっていたが、OTP 27 で標準インターフェイスができた形。

2-3. persistent_term の改善 — 高速な読み出し

`persistent_term` はほぼ変わらないグローバル定数を高速に読むための、ETS のいとこである。書き込みは非常に重い(システム全体の GC を誘発)が、読み出しはほぼゼロコスト。

OTP 27 は内部実装を整理し、メモリ使用量と書き込み時の GC コストを削減した。設定値・鍵・ルーティングテーブルのような「ほぼ永続」データに、ますます使いやすくなった。

%% 1 回書いて、数億回読む

persistent_term:put({config, max_connections}, 100000),

%% ホットパスでほぼ無料

Max = persistent_term:get({config, max_connections}).

2-4. JIT 改善とコンパイラの診断

- BEAMAsm JIT が ARM64 でも安定化(Apple Silicon、AWS Graviton で直接性能向上)。

- コンパイラ警告がより正確になり、エラーメッセージが親切になった。

- maps モジュールに `iterator/2`、`filtermap/2` などが追加。

OTP 27 への移行チェックリスト

□ Rebar3 / Mix を OTP 27 互換バージョンに更新

□ Dialyzer を再実行(型システムが微妙に変化)

□ EPMD 代替コールバックを使うなら net_kernel 設定を確認

□ トリプルクオート文字列は IDE 対応を確認 (Erlang LS, ElixirLS)

□ 依存ライブラリの OTP 27 互換性を確認(大半は OK)

第 3 章 · OTP 28 プレビュー — 次に来るもの

2026 年 5 月現在、OTP 28 は release candidate 段階。正式リリースは 2026 年夏目標。主な変化。

3-1. JIT のさらなる最適化

- BEAMAsm のレジスタ割り当てアルゴリズムを再整備、ホットループで 10〜15% の追加性能。

- 関数呼び出しのインライン化ヒューリスティクス改善。

3-2. set / map の標準ライブラリ拡張

%% OTP 28 で追加予定の maps 関数

maps:groups_from_list(fun(X) -> X rem 2 end, [1,2,3,4,5]).

%% => #{0 => [4,2], 1 => [5,3,1]}

%% set モジュールにも同様の便利関数

3-3. ssl スタックの現代化 — TLS 1.3 の完成

- TLS 1.3 の 0-RTT モードを完全サポート。

- ポスト量子鍵交換アルゴリズム(Kyber / ML-KEM)を実験的サポート。

3-4. logger と telemetry の統合強化

- OpenTelemetry 互換のためのインフラ拡張。

- 構造化ロギングのメタデータ標準化。

3-5. 分散モニタリングの改善

- `monitor/2`、`link/1` の分散環境エラーメッセージ改善。

- ノード間 monitor メッセージ喪失時の復旧動作を明確化。

> **まとめ:** OTP 28 は革命ではない。**磨き(polish)** である。30 年ものの言語が毎年どう改善され続けるか、その良い例。

第 4 章 · Cowboy 3 — BEAM の標準 HTTP サーバ

**Cowboy** は Loïc Hoguin が作った小さく速い Erlang HTTP サーバ。Plug、Phoenix、RabbitMQ Management UI、ほぼすべての Erlang/Elixir ウェブスタックの既定 HTTP サーバ。

2024 年末に Cowboy 3 がリリースされた。中核の変化。

4-1. HTTP/2 の完成度

- Cowboy 2 も HTTP/2 をサポートしていたが、一部 corner case で RFC 9113 と食い違いがあった。

- Cowboy 3 は仕様をもう一度丸ごと洗い、fuzzing テストを追加。

- 特に GOAWAY 処理、フロー制御ウィンドウのレースコンディションを修正。

4-2. WebSocket の安定化

- WebSocket 圧縮 (permessage-deflate) オプションの整理。

- 部分メッセージ(framing)処理におけるメモリリークの可能性を修正。

4-3. HTTP/3 — 実験的サポート

- QUIC トランスポート経由の HTTP/3 が experimental に入った。

- 本番推奨ではないが、ベータ導入を始めているチームがある。

4-4. シンプルな Cowboy ハンドラ例

%% rebar.config に cowboy 依存を追加した上で

-module(hello_handler).

-export([init/2]).

init(Req0, State) ->

Req = cowboy_req:reply(200,

#{<<"content-type">> => <<"text/plain">>},

<<"Hello from Cowboy 3!">>,

Req0),

{ok, Req, State}.

%% ルータに登録

start() ->

Dispatch = cowboy_router:compile([

{'_', [{"/", hello_handler, []}]}

]),

{ok, _} = cowboy:start_clear(my_http_listener,

[{port, 8080}],

#{env => #{dispatch => Dispatch}}).

Cowboy を使う代表的なシステム

- **Phoenix** (Elixir Web フレームワーク) — デフォルトアダプタの一つ。

- **RabbitMQ Management Plugin**。

- **Akamai の一部エッジサービス**。

- **WhatsApp 内製ツール**。

第 5 章 · Bandit — 純 Elixir で書き直された HTTP サーバ

Cowboy は Erlang で書かれている。Plug/Phoenix は Elixir で書かれている。両者をつなぐアダプタ (`Plug.Cowboy`) は常に存在したが、「Elixir スタック全体を Elixir で書きたい」という声があった。

**Bandit** (2022 年開始、Mat Trudel 主導)がその答え。

5-1. Bandit が狙ったもの

Cowboy: Erlang -> Elixir アダプタ (Plug.Cowboy) -> Plug/Phoenix

Bandit: Elixir -> -> Plug/Phoenix

- 純 Elixir で HTTP/1.1、HTTP/2、WebSocket を実装。

- Plug インターフェイスと直接統合(アダプタ層が不要)。

- 一部のマイクロベンチで Cowboy 比 10〜30% 速い。

5-2. Phoenix との統合

Phoenix 1.7 以降、`Bandit` を Plug.Cowboy のドロップイン代替として使える。

config/config.exs

config :my_app, MyAppWeb.Endpoint,

adapter: Bandit.PhoenixAdapter,

http: [port: 4000]

これ 1 行で済む。Phoenix LiveView、channels、controllers すべてそのまま動く。

5-3. Bandit vs Cowboy — 2026 年比較

Cowboy 3 Bandit

ホスト言語 Erlang Elixir

HTTP/1.1 本番運用済み 本番運用済み

HTTP/2 RFC 9113 RFC 9113

HTTP/3 実験的 まだなし

WebSocket あり あり

Plug 統合 アダプタ経由 ネイティブ

運用実績 10 年以上 3〜4 年

本番推奨 保守的なら ✓ 新規 Phoenix なら ✓

5-4. どちらを選ぶか

- **既存 Erlang システム** → Cowboy 3。

- **新規 Phoenix プロジェクト** → Bandit が徐々にデフォルト化。

- **HTTP/3 が必要** → Cowboy 3 (現状)。

- **純 Elixir コードベースが欲しい** → Bandit。

第 6 章 · Khepri — RabbitMQ チームが作った Mnesia 後継

Mnesia は 1990 年代の Erlang の分散 DBMS。メモリ・ディスクハイブリッド、トランザクション、ETS 互換のインターフェイス。しかし **netsplit (ネットワーク分断) 時の挙動が古くから弱点** として知られていた — 分断が起きると両側が生き残り、データが分かれ、再合流には手動介入が必要だった。

RabbitMQ チーム(Pivotal → VMware → Broadcom)がこの問題に正面から取り組んで作ったのが **Khepri** である。

6-1. Khepri の核心アイデア

> 「Mnesia を置き換える、ただし **Raft 合意** をその下に敷く。」

- ツリー形式のキー値ストア(Zookeeper / etcd に近いデータモデル)。

- すべての書き込みは Raft 合意を通る → 過半数が生きていなければ書き込めない。

- netsplit 時、両側が「真実は自分だ」と主張する事態がなくなる(少数派は書き込めない)。

- Erlang/OTP で書かれており、外部依存なし。

6-2. Khepri のデータモデル

%% パスベースのツリー構造

ok = khepri:put([app, config, max_users], 1000),

{ok, 1000} = khepri:get([app, config, max_users]),

%% ワイルドカードクエリ

{ok, Map} = khepri:get_many([app, config, ?KHEPRI_WILDCARD_STAR]).

Zookeeper の znode、etcd のキーツリーに非常に近い設計。

6-3. RabbitMQ での採用

- RabbitMQ 4.0 (2024 年 9 月) から Khepri をメタデータストアとして選択可能。

- 4.x の後半でデフォルト化予定。

- 置換対象は RabbitMQ 内部の Mnesia(キュー定義、ユーザー、vhost のようなメタデータ)。

- メッセージ本体は別のキューエンジン(quorum queue など)が扱うため、Khepri は「コントロールプレーン」に集中。

6-4. 自分のシステムで Khepri を使う

%% rebar.config に khepri を追加

{deps, [

{khepri, "0.14.0"}

]}.

%% 起動

{ok, _} = khepri:start(),

%% トランザクション

khepri:transaction(fun() ->

khepri_tx:put([users, alice], #{role => admin}),

khepri_tx:put([users, bob], #{role => user})

end).

> **結論:** Khepri は Mnesia を「静かに」置き換えつつある。新規の分散 BEAM システムでメタデータストアを選ぶとき、Khepri はますます合理的な選択になっている。

第 7 章 · Mnesia / partisan — 分散データと分散通信

7-1. Mnesia — まだ生きている

Khepri が登場したからといって Mnesia が消えたわけではない。2026 年でも:

- トランザクションが要る場所、テーブル形式のデータ、ETS とそっくりなインターフェイスが要る場所で、いまだに使われる。

- ejabberd (XMPP サーバ)、一部のゲームサーバ、通信機器の中で Mnesia が今も動いている。

- 弱点は変わらない: netsplit 対応が弱く、大規模データセットでは運用負担がある。

**指針:**

- データが小さく、ノード数が少ない → Mnesia でも問題なし。

- netsplit 一貫性が重要 → Khepri か外部 DB。

- ただのキャッシュなら → ETS だけで足りる。

7-2. partisan — 分散 Erlang そのものへの挑戦

既定の分散 Erlang (`net_kernel`) はフルメッシュトポロジを前提とする。すべてのノードがすべてのノードと直接接続。ノード数が 100 を超え始めるとメッセージ爆発と head-of-line blocking の問題が出てくる。

**partisan** (Christopher Meiklejohn ほか)がこれを再設計した。

distributed Erlang: N ノード -> N*(N-1)/2 接続(フルメッシュ)

partisan: 複数のトポロジオプション

- フルメッシュ

- hyparview (P2P オーバレイ)

- クライアント・サーバ

- PG2 ベースの静的グループ

中核アイデア:

1. **マルチチャンネル** — ノードペアの間に複数の TCP 接続。小さいメッセージが大きいメッセージで詰まらない。

2. **モノリシック vs P2P** — トポロジを選べる。

3. **後方互換** — `gen_server` インターフェイスをそのまま使え、内部だけ差し替え。

2026 年現在の partisan は:

- 学術研究から始まり、一部の本番(特に IoT バックエンドやゲームサーバ)で採用。

- 主流はまだ distributed Erlang だが、**大規模クラスタ** では partisan を検討するチームが増えている。

第 8 章 · Nerves — 組み込み Erlang/Elixir

**Nerves** は Frank Hunleth 主導の組み込みフレームワーク。中核アイデア:

> 「Linux の上で BEAM だけを動かす。ユーザランド全部が Elixir/Erlang。」

8-1. Nerves が狙ったもの

- Raspberry Pi、BeagleBone、産業用シングルボードコンピュータ。

- 従来の組み込み Linux ディストリ(buildroot、yocto)の複雑さを下げ、**再現可能なファームウェアビルド**。

- A/B パーティションを使った安全な OTA アップデート。

- BEAM の supervisor モデルをファームウェア全体に適用。

8-2. 典型的な Nerves プロジェクト構成

新規 Nerves プロジェクト作成 (Raspberry Pi 4 ターゲット)

mix nerves.new my_iot_device --target rpi4

cd my_iot_device

ファームウェアビルド

MIX_TARGET=rpi4 mix deps.get

MIX_TARGET=rpi4 mix firmware

SD カードに焼く

MIX_TARGET=rpi4 mix firmware.burn

ファームウェアの中にはブートローダ、Linux カーネル、BEAM、そして Elixir アプリケーションが入っている。ユーザランドにはほぼ他に何もない。

8-3. 実例

- **FarmBot** — オープンソースの農業ロボット。

- **GRiSP** — 産業用組み込みボード。Erlang をベアメタル(または RTOS の上)で直接駆動。

- **物流・倉庫自動化機器** — 一部の会社が Nerves ベースの PLC 代替を出荷。

- **オーディオ機器、デジタルサイネージ**。

8-4. NervesHub — OTA フリート管理

Nerves チームが作った NervesHub は、ファームウェア更新の中央管理システム。デバイス艦隊全体に段階的ロールアウトができる。

> **ポイント:** Nerves は「組み込みも BEAM の supervisor の中で動かせば死なない」という仮説を実証するプロジェクト。

第 9 章 · gleam — 静的型付け BEAM 言語

**gleam** (Louis Pilfold 作、2016 年開始)は BEAM の上で動く **静的型付け** 関数型言語である。2024 年にシード調達と 1.0 リリースを経て、本格的に注目を集めた。

9-1. gleam が提示するもの

pub fn main() {

let numbers = [1, 2, 3, 4, 5]

let doubled = list.map(numbers, fn(n) { n * 2 })

io.debug(doubled)

}

- **型推論** — 変数宣言にほとんど型を書かなくても、コンパイル時にすべての型が決まる。

- **式ベース** — Erlang/Elixir 寄りの関数型スタイル。

- **BEAM と JavaScript** の二つのターゲットへコンパイル。(そう、gleam は JS も吐く。)

- **Erlang FFI** — 既存の Erlang/OTP ライブラリをそのまま呼び出せる。

9-2. なぜ静的型を BEAM に持ち込んだか

- Elixir、Erlang は動的型付け。dialyzer (success typing) はあるが限界がある。

- gleam は最初から強力な静的型(Hindley-Milner 系)で設計。

- 結果: **コンパイルが通ればたいていのミスは捕まる** — Rust や Haskell に近い。

9-3. 簡単な OTP スタイルのアクター (gleam_otp)

pub fn main() {

let assert Ok(subject) = actor.start(0, handle_message)

process.send(subject, Increment)

process.send(subject, Increment)

// 二度インクリメント

}

pub type Message {

Increment

GetCount(reply_to: process.Subject(Int))

}

fn handle_message(message: Message, count: Int) -> actor.Next(Message, Int) {

case message {

Increment -> actor.continue(count + 1)

GetCount(reply_to) -> {

process.send(reply_to, count)

actor.continue(count)

}

}

}

型のある OTP。プロセスが受け取れるメッセージの種類がコンパイル時に検証される。

9-4. gleam 1.0 以降の動き

- **エコシステムの急成長** — hex.pm の gleam パッケージ数が急増。

- **2024 年シード調達** — Pilfold が gleam の開発に専念可能に。

- **JavaScript ターゲット** — gleam コードの一部をフロントエンドに使える。

- **コミュニティの雰囲気** — Elixir コミュニティに友好的に受け入れられている。

9-5. gleam を選ぶべきとき

- 静的型付けの安心感が欲しいとき。

- BEAM の同時実行性・耐障害性を求めつつ **型安全性** も求めるとき。

- 新規プロジェクトとして開始できるとき(既存 Elixir コードベースの移行は別問題)。

第 10 章 · Lustre — gleam のウェブフレームワーク

**Lustre** は Hayleigh Thompson が作った gleam のフロントエンドフレームワーク。Elm に強くインスパイアされた The Elm Architecture (TEA) パターン。

10-1. Lustre のモデル

┌─────────┐ Msg ┌─────────┐

│ View │ ───────────>│ Update │

│ (HTML) │ │ (モデル │

└─────────┘ <────────│ │ 変更) │

▲ Model └─────────┘

└──── ユーザー操作 ────┐

(ブラウザ)

10-2. シンプルなカウンタ (Lustre)

pub fn main() {

let app = lustre.simple(init, update, view)

let assert Ok(_) = lustre.start(app, "#app", Nil)

}

fn init(_) {

0

}

pub type Msg {

Incr

Decr

}

fn update(model: Int, msg: Msg) -> Int {

case msg {

Incr -> model + 1

Decr -> model - 1

}

}

fn view(model: Int) {

div([], [

button([event.on_click(Decr)], [text("-")]),

text(int.to_string(model)),

button([event.on_click(Incr)], [text("+")]),

])

}

10-3. Lustre の二つのモード

1. **クライアントサイド** — gleam を JavaScript にコンパイルしてブラウザで実行。

2. **サーバコンポーネント** — Phoenix LiveView スタイルで、サーバが状態を持ち、ブラウザは薄いクライアント。

サーバコンポーネントモードは LiveView に近いが、gleam の型安全性が持ち込まれる点で差別化される。

10-4. 2026 年の位置付け

- Lustre はまだ主流ではない。

- 小さなプロジェクト、サイドプロジェクト、gleam のフルスタックを試したいチームが採用中。

- LiveView の代替としての可能性を探る段階。

第 11 章 · AtomVM — ESP32 で Erlang を走らせる

**AtomVM** (Davide Bettio ほか)は BEAM のバイトコードをマイコンで実行する VM である。

11-1. AtomVM が狙う場所

- **ESP32** (Wi-Fi/Bluetooth 内蔵 MCU、非常に安価)

- **STM32**

- **Raspberry Pi Pico (RP2040)**

これらのボードは Linux を載せるには小さすぎる(普通は数百 KB〜数 MB の RAM)。Nerves は来られないが、AtomVM は来られる。

11-2. どう動くか

- 標準 BEAM バイトコード (`.beam` ファイル)をそのまま読み込み、マイコンで解釈・実行。

- 標準ライブラリの **一部のみ** 対応(メモリ制約)。

- supervisor、gen_server のような OTP パターンは使える。

11-3. ESP32 での "Hello, Erlang"

-module(blink).

-export([start/0]).

start() ->

Pin = 2,

gpio:set_pin_mode(Pin, output),

loop(Pin, high).

loop(Pin, State) ->

gpio:digital_write(Pin, State),

timer:sleep(500),

NextState = case State of

high -> low;

low -> high

end,

loop(Pin, NextState).

コンパイル後 ESP32 に焼く(概略)

erlc blink.erl

atomvm_packbeam blink.avm blink.beam

esptool.py write_flash 0x250000 blink.avm

LED 点滅のような入門例から始めて、BLE ベースの IoT デバイス、小さなメッセージゲートウェイまで作れる。

11-4. AtomVM と Nerves の比較

AtomVM Nerves

ターゲット MCU (ESP32, STM32) SBC (Pi, BeagleBone)

RAM 数百 KB 数 GB も可能

OS なし (ベアメタル/FreeRTOS) Linux

BEAM AtomVM (subset) 正式な OTP

ユースケース センサノード、BLE デバイス エッジゲートウェイ

最小ノードは AtomVM、それを集約するハブは Nerves、クラウドバックエンドは正式な OTP — そういう構図が成立する。

11-5. 2026 年現在

- AtomVM 0.6 系列が安定化段階。

- Erlang/Elixir 両方に対応(どちらも `.beam` にコンパイルされるので)。

- コミュニティは活発だが小さい。IoT/エッジに興味のある BEAM ユーザーが集まる場所。

第 12 章 · RabbitMQ — Erlang の代表選手

RabbitMQ は別記事で取り上げているので、ここでは簡潔に。重要なのは **この会社が Erlang を主流に押し上げた最大の貢献者** であること。

12-1. RabbitMQ が Erlang を選んだ理由

- AMQP メッセージブローカは本質的に数万〜数十万の同時接続を捌く必要がある。

- 死んではいけない — supervisor ツリー。

- 分散クラスタリングが最初から必要だった。

- Erlang はまさにそのために作られた言語だった。

12-2. 2026 年の RabbitMQ

- バージョン 4.x。

- **Quorum Queue** がデフォルト。Raft 合意ベースのキュー(旧クラシックミラーキューの置換)。

- **Khepri** がメタデータストアへ移行中。

- **MQTT 5.0**、**Streams**(Kafka 風の追加)対応。

12-3. Erlang エコシステムへの影響

- Erlang を単なる「通信会社の言語」から **主流のインフラコンポーネント** に引き上げた最大の立役者。

- 多くの企業は RabbitMQ 経由で「あれ? Erlang のシステムって意外と死なないな」を初体験。

第 13 章 · 本番事例 — WhatsApp / Klarna / Discord / Riot / Cisco / Akamai

BEAM を真剣に使っている会社の短いケーススタディ。

13-1. WhatsApp — Erlang スケール伝説

- 2009 年創業。Jan Koum が ejabberd (XMPP サーバ、Erlang) 出身で、最初から Erlang。

- 1 台のサーバで 200 万同時接続を初めて公に見せたシステム。

- 2014 年 Facebook 買収時に、9 億ユーザーを 50 名のエンジニアで運用。

- 買収後もコアは依然として Erlang/FreeBSD ベース。

- 「**少ない人数で巨大な同時実行性**」が BEAM のキャッチフレーズになった。

13-2. Klarna — 金融スケールの Erlang

- スウェーデンの BNPL (buy now, pay later) フィンテック。

- 2005 年から Erlang を採用。決済トランザクション処理、リスク評価の一部。

- モノリシックな Erlang システムから徐々にマイクロサービス化。それでも Erlang はコアに残る。

- Erlang のホットコードスワップを無停止デプロイで積極活用。

13-3. Discord — Erlang/Elixir ハイブリッド

- ボイス・テキストゲートウェイは Elixir (BEAM)。

- 一つのチャネルに数百万ユーザーが同時にメッセージを受け取る状況を、BEAM のプロセスモデルで処理。

- 一部コアのデータプレーンは Rust で書き直し(Erlang/Elixir で苦手な部分は正直に他言語へ)。

- ただし **セッション・ルーティング・リアルタイム通信は Elixir 担当**。

13-4. Riot Games — Erlang 製チャット

- League of Legends のゲーム内チャットが Erlang (ejabberd 派生)ベース。

- 数千万人規模の同時チャットを安定に処理。

13-5. Cisco — XMPP / 通信インフラ

- 一部通信機器、IP 電話、コラボレーションツールのバックエンドに Erlang。

- Cisco Webex の一部コンポーネントも Erlang を使っているとされる。

13-6. Akamai — DNS の一部

- CDN 大手 Akamai が DNS インフラの一部に Erlang ベースのサービスを運用。

- 秒間数十万クエリで BEAM の同時実行性が活きる。

ケーススタディの共通点

- **死んではいけないシステム**。

- **数万〜数百万の同時接続**。

- **メッセージング・リアルタイムプロトコル**。

- **分散クラスタリング**。

CPU バウンドではなく、**同時実行性バウンド** が本質の会社たち。

第 14 章 · 韓国・日本 — 東アジアの BEAM

西洋圏では BEAM がよく知られているが、東アジアでの採用はどう見えるか。

14-1. 韓国 — カカオ、通信会社、一部スタートアップ

- **Kakao** の一部メッセージング・通知インフラが時期によって Erlang/Elixir を採用。大規模な通知ファンアウトに BEAM モデルが適合。

- **Danggn (Carrot)** — チャット・プッシュの一部で Elixir Phoenix を活用した事例(社内テックトークなどで言及)。

- **通信会社** — KT、SK テレコムの一部通信インフラで Erlang ベースのミドルウェアを使用。ejabberd ベースのメッセージングシステムも。

- **スタートアップ・ゲーム会社** — 一部のモバイルゲームバックエンド(マッチメイキング、チャットサーバ)で Elixir 採用。

> **現実:** 韓国で BEAM は主流ではない。しかしメッセージング・リアルタイムが本質の会社では、静かに使われている。

14-2. 日本 — ピクシブ、NTT、通信インフラ

- **ピクシブ** — 一部メッセージング・通知システムで時期により Elixir/Erlang を採用。カンファレンス発表事例あり。

- **NTT** — 通信インフラのバックボーンの一部に Erlang ベースのミドルウェア。通信機器メーカー NEC、富士通も同様に一部領域で。

- **DMM** — 一部マイクロサービスで Elixir を試行。

- **Drecom** などゲーム会社 — 一部のリアルタイムバックエンド。

14-3. 東アジアで BEAM 採用が遅く見える理由

- **リファレンス人材プールが小さい** — Java、Go、Rust と比べて採用市場が狭い。

- **教育で関数型言語に触れる機会が少ない**。

- **韓国・日本の企業文化が保守的** — 実績のあるスタックを好む。(逆説的に BEAM は非常に実績があるが、東アジア市場の認知はそうではない。)

- ただし **メッセージング・リアルタイム・IoT** の会社では、導入事例が地道に増えている。

第 15 章 · 誰が BEAM を選ぶべきか — 意思決定ガイド

最後に 2026 年時点で「このプロジェクトに BEAM は合うか?」を判断する実用ガイド。

15-1. BEAM が強い領域

- **リアルタイムメッセージング・チャット** — Discord、WhatsApp、Slack バックエンドの一部。

- **メッセージブローカ** — RabbitMQ が証明。

- **長寿命の接続** — 大量同時の WebSocket、MQTT、SSE。

- **分散システム** — クラスタリングが最初から内蔵。

- **耐障害性が必須のシステム** — supervisor ツリー、"let it crash" 哲学。

- **プロトコルゲートウェイ** — XMPP、AMQP、MQTT、通信シグナリング。

- **IoT バックエンド** — 数万デバイスの同時接続。

15-2. BEAM が弱い領域

- **数値計算・機械学習の学習** — CPU バウンドは NIF を経由する必要がある。

- **単一スレッドのスループット** — Go、Rust、C++ のほうが速い。

- **システムプログラミング** — カーネル、ドライバ、ゲームエンジン。

- **デスクトップ GUI アプリ**。

- **市場投入の速さ・採用のしやすさ** — 人材が見つかりにくい。

15-3. 言語選択 — Erlang vs Elixir vs gleam

Erlang Elixir gleam

型 動的 動的 (dialyzer) 静的

文法 Prolog 風 Ruby 風 Rust / Elm 風

エコシステム 古い、安定 最も活発 急成長

ツール rebar3 mix (優れる) gleam (簡潔)

主な用途 既存システム・OTP 新規 Web・Phoenix 新規型安全

学習曲線 文法ゆえに急 やわらかい 関数型経験者は速い

推奨:

- **新規 BEAM プロジェクト、多くの場合** → Elixir。

- **型安全性が重要** → gleam。

- **既存 Erlang システムの維持・拡張** → Erlang。

- **混ぜてもよい** — 同じ BEAM 上で相互呼び出し可能。

15-4. HTTP サーバ選択

- 新規 Phoenix → **Bandit**。

- 既存 Erlang/Cowboy スタック → **Cowboy 3** を維持。

- HTTP/3 が必要 → **Cowboy 3**。

15-5. 分散データ選択

- 小さなメタデータ、強い一貫性が必要 → **Khepri**。

- トランザクションの多いテーブルデータ、小規模クラスタ → **Mnesia**。

- キャッシュ・読み出し中心 → **ETS** (単一ノード) または外部 KV (Redis、FoundationDB)。

- 本格的な OLTP/OLAP → 外部 DB (PostgreSQL、ClickHouse など)。

15-6. 組み込み選択

- SBC (Pi、BeagleBone) → **Nerves**。

- MCU (ESP32、STM32) → **AtomVM**。

第 16 章 · 結び — BEAM は消えない

40 年にわたり、BEAM は通信会社の秘密兵器から始まり、インターネットのメッセージングインフラの背骨となった。2026 年の BEAM は:

- **OTP 27 / 28** で今も磨かれ、

- **Cowboy 3 / Bandit** で HTTP スタックが現代化され、

- **Khepri** で分散データの弱点を埋めつつあり、

- **gleam** で型安全のオプションを得て、

- **Nerves / AtomVM** で組み込み領域まで拡大した。

> **BEAM の約束は変わらない — 「死なないシステム」。** 30 年前に電話交換機が必要としたものは、2026 年の LLM 推論ゲートウェイ、メッセージキュー、IoT バックエンド、リアルタイム協業ツールにも同じく必要だ。

もしあなたのシステムが **「多数の接続を同時に維持し、絶対に死んではいけない」** 種類のものなら、BEAM を真剣に検討する価値がある。メッセージングでも、決済でも、IoT でも、チャットでも。

BEAM は 30 年後にも、たぶん 50 年後にも、誰かのバックエンドで静かに動いているはずだ。

参考 / References

- Erlang/OTP 27 リリースノート — https://www.erlang.org/news/170

- Erlang/OTP 公式ドキュメント — https://www.erlang.org/docs

- Erlang Ecosystem Foundation — https://erlef.org

- Cowboy 公式 — https://ninenines.eu

- Bandit GitHub — https://github.com/mtrudel/bandit

- Khepri プロジェクト — https://github.com/rabbitmq/khepri

- Khepri 紹介(RabbitMQ チーム) — https://blog.rabbitmq.com/posts/2022/05/khepri-0-1-0-release/

- Mnesia ユーザガイド — https://www.erlang.org/doc/apps/mnesia/users_guide.html

- partisan — https://github.com/lasp-lang/partisan

- Nerves プロジェクト — https://nerves-project.org

- NervesHub — https://www.nerves-hub.org

- Gleam 公式 — https://gleam.run

- Gleam 1.0 発表 — https://gleam.run/news/gleam-version-1/

- Lustre — https://hexdocs.pm/lustre

- AtomVM — https://www.atomvm.net

- RabbitMQ — https://www.rabbitmq.com

- Phoenix Framework — https://www.phoenixframework.org

- Phoenix LiveView — https://hexdocs.pm/phoenix_live_view

- WhatsApp engineering (historical) — https://www.erlang-factory.com/conference/SFBay2012/speakers/RickReed

- Discord blog — https://discord.com/blog

- 『Designing for Scalability with Erlang/OTP』(書籍) — Cesarini & Vinoski, O'Reilly

- 『Programming Phoenix LiveView』(書籍) — Tate & Dwyer, Pragmatic Bookshelf

현재 단락 (1/428)

1986 年。エリクソンの通信スイッチチームが新言語を作る。名前は Erlang。目的はただ一つ — **死なないシステム**。9 個の 9、つまり 99.9999999% の可用性を持つ電話交換機。

작성 글자: 0원문 글자: 17,854작성 단락: 0/428