水平スケーリング
サーバーの台数を増やして処理能力を向上させるスケーリング手法
インフラスケーリング
水平スケーリングとは
水平スケーリング (Scale Out) は、サーバーの台数を増やして処理能力を向上させるスケーリング手法である。垂直スケーリング (Scale Up: サーバーのスペックを上げる) と対比される。
水平 vs 垂直
| 観点 | 水平 (Scale Out) | 垂直 (Scale Up) |
|---|---|---|
| 方法 | 台数を増やす | スペックを上げる |
| 上限 | 理論上無限 | ハードウェアの上限 |
| コスト | 台数に比例 | 指数関数的に増加 |
| 可用性 | 1 台が落ちても継続 | 単一障害点 |
| 複雑さ | 分散システムの課題 | シンプル |
AWS サービスのスケーリング
| サービス | スケーリング方式 |
|---|---|
| Lambda | 自動水平スケーリング (同時実行数) |
| DynamoDB | 自動水平スケーリング (パーティション) |
| ECS | Auto Scaling (タスク数) |
| EC2 | Auto Scaling Group |
| Aurora | リードレプリカの追加 |
Lambda の水平スケーリング
リクエスト 1 → Lambda インスタンス A
リクエスト 2 → Lambda インスタンス B
リクエスト 3 → Lambda インスタンス C
→ リクエスト数に応じて自動的にインスタンスが増加
→ 設定不要、AWS が自動管理
水平スケーリングの前提条件
水平スケーリングにはいくつかの前提がある。プロセス内に状態を持たないステートレス設計、セッションやファイルを外部ストレージに保存する共有ストレージ、同じリクエストを複数回処理しても同じ結果になる冪等性、リクエストを均等に分散するロードバランシングだ。
ステートレス設計
// ❌ ステートフル: プロセス内にセッションを保存
const sessions = new Map(); // Lambda インスタンスごとに異なる
// ✅ ステートレス: 外部ストレージに保存
const session = await db.get({ TableName: 'sessions', Key: { id: sessionId } });
DynamoDB の水平スケーリング
パーティションキー: userId
→ ハッシュ値でパーティションに分散
→ パーティション数が自動的に増加
→ 各パーティションが独立して処理
❌ ホットパーティション: 1 つのキーにアクセスが集中
✅ 均等な分散: ユーザー ID のように分散するキー
コスト比較
垂直: t3.micro → t3.xlarge → t3.2xlarge
$8/月 → $134/月 → $268/月 (指数的に増加)
水平: t3.micro × N 台
$8/月 × 2 = $16/月, × 4 = $32/月 (線形に増加)
理論と実装の両面から学ぶなら関連書籍が参考になる。