AI Session Notes - 2026-03-27
Go が Web バックエンドに選ばれる本当の理由
学んだこと
- Go が Web 開発に向く理由は goroutine(並行処理)ではなく、運用面の強さが主因
- ビルドが速くて楽: シングルバイナリにコンパイルされ、依存ランタイム不要でデプロイできる
- メモリフットプリントが小さい: Python/Node.js/Java と比べてプロセスのメモリ消費が少ない
- 起動が高速: JVM のようなウォームアップが不要。コンテナのスケールアウト時にすぐリクエストを受けられる
- コンテナ向き: 上記すべてが合わさり、Kubernetes 等での運用と相性が良い
- 典型的な CRUD アプリ(DB を読み書きするだけの Web)では、ボトルネックは DB の I/O 待ちであり、goroutine の並行処理能力はあまり関係ない。この程度なら Node.js の async/await や Python の非同期でも十分対応できる
goroutine が真価を発揮するケース
- goroutine が活きるのは「DB の読み書き以外の仕事が重い」ケース:
- リアルタイムチャット / 通知システム: 数万ユーザーが WebSocket で常時接続。1 goroutine ≒ 数 KB なので 1 プロセスで数万〜数十万接続を捌ける
- API ゲートウェイ / アグリゲーター: 1 リクエストに対して裏で複数のマイクロサービスを同時に呼び、結果をまとめて返す
- ストリーミング処理: ログ収集サーバー、IoT デバイスからのデータ受信など
- プロキシ / ロードバランサー: Traefik、Caddy など Go 製のプロキシが多い
| アプリ |
やること |
ボトルネック |
goroutine の恩恵 |
| ブログ、EC サイト |
DB 読み書き |
DB の I/O |
少ない |
| チャットサーバー |
数万接続を維持 |
接続数 × メモリ |
大きい |
| API ゲートウェイ |
複数 API を並行呼出 |
外部 API の応答待ち |
大きい |
プロセス・スレッド・goroutine の違い
学んだこと
- プロセス: アプリそのもの。自分専用のメモリ空間を持ち、他のプロセスとは完全に独立。起動にもメモリにもコストがかかる(重い)
- スレッド: プロセスの中の作業員。プロセス内のメモリを共有して使える。プロセスより軽いが、1 本あたり約 1MB のメモリを消費する
- goroutine: Go 独自の「めちゃくちゃ軽いスレッドのようなもの」。1 個あたり数 KB のメモリ消費で、スレッドと比べて桁違いに軽い
スレッド: 1 本 ≒ 1MB → 1 万本 = 10GB
goroutine: 1 個 ≒ 数KB → 1 万個 = 数十MB
Rails の同時処理モデルと Go との使い分け
学んだこと
- Rails(Puma)はワーカー(プロセス)× スレッドで同時リクエスト数が決まる。例: ワーカー 3 × スレッド 3 = 同時 9 リクエスト
- 通常の CRUD リクエストは数百 ms で完了しスレッドがすぐ空くため、この構成で十分に捌ける
- WebSocket の場合は話が変わる: 接続している間ずっとスレッドを占有するため、同時接続数がスレッド数に制限される
- Rails: 1 万人接続 → スレッド 1 万本 → メモリ数十 GB(現実的に厳しい)
- Go: 1 万人接続 → goroutine 1 万個 → メモリ数十 MB(余裕)
Rails と Go の適材適所
|
Rails |
Go |
| 強み |
CRUD 中心の Web アプリ。開発速度が圧倒的に速い |
大量の同時接続、リアルタイム処理、高トラフィック |
| 具体例 |
EC サイト、管理画面、ブログ |
チャット、リアルタイム対戦ゲーム、プロキシ |
- 実際の現場では「メインの Web アプリは Rails、チャット機能だけ Go のマイクロサービス」という構成もよくある
リアルタイム対戦ゲーム(大富豪のような)が Go に向く理由
- ブラウザで複数人が常時接続してゲーム状態を共有する仕組みは、WebSocket の常時接続が前提
- 誰かがカードを出したら即座に全プレイヤーにブロードキャストする必要があり、goroutine の軽さが活きる
- Go はコンパイル済みネイティブコードで処理が速く、GC の停止時間も短いため低レイテンシが求められるゲームに適している
メタ情報
- ツール: Claude Code
- 関連技術: Go, goroutine, Ruby on Rails, Puma, WebSocket, プロセス, スレッド, コンテナ, Kubernetes