「これがMonth 7の集大成だ」と佐藤CTOが言います。「大規模ECサイトのパフォーマンス改善計画を一から策定してほしい。ボトルネック分析から、キャッシュ設計、負荷テスト計画、フロントエンド最適化まで、全てを統合した改善ロードマップを作ってくれ。」
シナリオ
企業: 大手ECサイト「ShopMaster」
月間: 500万MAU、ピーク時 30,000 RPS
課題:
- 直近3ヶ月でレスポンスタイムが2倍に悪化
- Lighthouseスコア: 38点
- 年末セール(2ヶ月後)に向けてピーク対策が必要
インフラ構成:
- Web: ECS Fargate × 20タスク (c5.xlarge相当)
- API: ECS Fargate × 15タスク
- DB: RDS PostgreSQL r6g.2xlarge (Primary + Read Replica 2台)
- Cache: ElastiCache Redis cluster (3ノード)
- CDN: CloudFront
- 検索: OpenSearch (3ノード)
現在の問題点:
- p95レスポンス: 1.8秒 (SLA: 500ms)
- DBのCPU使用率: 平均75%(ピーク92%)
- Redis Hit Rate: 62%(低い)
- バンドルサイズ: main.js 1.5MB (gzip)
- LCP: 5.8秒
Part 1: ボトルネック分析(20分)
システムの各レイヤーを分析し、ボトルネックマップを作成せよ。
解答例
■ ボトルネックマップ(リトルの法則で分析)
1. CDN層: CloudFront → 問題なし(Cache Hit Rate 85%)
2. Web層: 20タスク × 100同時接続 / 50ms = 40,000 RPS → 余裕あり
3. API層: 15タスク × 50同時接続 / 80ms = 9,375 RPS → 余裕あり
4. DB層: コネクション500 / 15ms = 33,333 QPS → 余裕があるように見えるが
→ CPU 75%で実質半分以下。重いクエリが原因
→ ★ ボトルネック #1: 未最適化クエリ
5. Redis: Hit Rate 62% → 38%がDBに到達
→ ★ ボトルネック #2: キャッシュ戦略の不備
6. OpenSearch: 検索クエリ p95 800ms → インデックス最適化必要
7. フロントエンド: LCP 5.8s, バンドル1.5MB
→ ★ ボトルネック #3: フロントエンド未最適化
改善優先順位:
1. DBクエリ最適化 + キャッシュ改善 → p95を1.8s→500msに
2. フロントエンド最適化 → LCPを5.8s→2.5s以下に
3. セール対策のスケーリング計画
Part 2: キャッシュ戦略の設計(20分)
Redis Hit Rate を62%→90%以上に改善するキャッシュ戦略を設計せよ。
解答例
| レイヤー | 対象 | TTL | 戦略 |
|---|---|---|---|
| CDN | 静的アセット、商品画像 | 24h | Cache-Control: public, max-age=86400 |
| CDN | 商品一覧API | 60s | stale-while-revalidate=300 |
| Redis | 商品詳細 | 5min + ジッター | Cache-Aside + 更新時Invalidation |
| Redis | カテゴリ・タグ一覧 | 30min | Write-Through |
| Redis | 検索結果 | 2min | Cache-Aside(上位100クエリのみ) |
| Redis | ユーザーセッション | 24h | - |
| App | 計算結果キャッシュ | リクエスト中 | Request-Scoped Cache |
改善ポイント:
1. 商品詳細のTTLが短すぎた(30秒→5分に延長)
2. カテゴリ一覧がキャッシュされていなかった
3. 人気検索クエリのキャッシュ追加(全体の60%のトラフィック)
4. TTLにジッター追加(±20%)でサンダリングハード防止
期待効果: Hit Rate 62% → 92%
DB QPS: 現在の38%がキャッシュヒットで8%に → DB負荷75%減
Part 3: 負荷テストとセール対策(25分)
2ヶ月後の年末セールに向けた負荷テスト計画とスケーリング戦略を策定せよ。
解答例
■ セール想定トラフィック
通常ピーク: 30,000 RPS
セールピーク: 90,000 RPS(3倍を想定)
フラッシュセール(瞬間最大): 150,000 RPS(5倍)
■ 負荷テスト計画
Phase 1(1ヶ月前): ベースライン測定
- 現状の限界点を特定(Break Point Test)
- 各レイヤーの飽和点を測定
Phase 2(3週間前): 最適化後の検証
- DB最適化・キャッシュ改善後のパフォーマンス確認
- 目標: p95 500ms で 50,000 RPS 達成
Phase 3(2週間前): セール想定テスト
- 90,000 RPS の定常負荷テスト(30分)
- 150,000 RPS のスパイクテスト(5分間)
Phase 4(1週間前): Soak Test
- 50,000 RPS × 4時間の耐久テスト
- メモリリーク、コネクション枯渇の検証
■ スケーリング計画
Web: 20 → 60タスク(事前スケール)
API: 15 → 45タスク
DB: r6g.4xlarge にスケールアップ + Read Replica 2→4台
Redis: 3→6ノードにスケールアウト
CDN: キャッシュTTL延長(セール期間中)
■ オートスケーリング
- 事前スケール: セール開始1時間前にmin instancesを引き上げ
- 動的スケール: CPU 60%超過で追加スケールアウト
- max instances: Web 100, API 80
Part 4: フロントエンド最適化計画(15分)
Lighthouseスコアを38→90以上に改善する計画を策定せよ。
解答例
| 施策 | 影響指標 | 改善幅 | 優先度 |
|---|---|---|---|
| バンドル分割 + Tree Shaking | TBT, INP | 1.5MB→300KB | P0 |
| 画像WebP/AVIF変換 | LCP | 5.8s→2.2s | P0 |
| Critical CSS インライン化 | FCP | 3.1s→1.0s | P1 |
| ISR導入(トップ/商品詳細) | TTFB, LCP | さらに改善 | P1 |
| img width/height設定 | CLS | 0.35→0.05 | P1 |
| フォントサブセット化 | FCP, CLS | 16MB→300KB | P2 |
| リスト仮想化 | INP | 450ms→100ms | P2 |
実施スケジュール:
Week 1: P0施策(バンドル最適化 + 画像最適化) → スコア65想定
Week 2: P1施策(CSS/ISR/CLS修正) → スコア80想定
Week 3: P2施策 + 検証 → スコア90+想定
まとめ
| ポイント | 内容 |
|---|---|
| ボトルネック分析 | リトルの法則で各レイヤーを定量的に評価 |
| キャッシュ戦略 | 多層キャッシュでDB負荷を75%削減 |
| セール対策 | 段階的な負荷テストと事前スケーリング |
| フロントエンド | バンドル/画像/レンダリングの3軸で最適化 |
チェックリスト
- ボトルネックマップを作成できた
- キャッシュ戦略を設計できた
- 負荷テスト計画とスケーリング戦略を策定できた
- フロントエンド最適化の優先順位を付けられた
次のステップへ
最後は卒業クイズです。
推定読了時間: 90分