EXERCISE 90分

「これが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静的アセット、商品画像24hCache-Control: public, max-age=86400
CDN商品一覧API60sstale-while-revalidate=300
Redis商品詳細5min + ジッターCache-Aside + 更新時Invalidation
Redisカテゴリ・タグ一覧30minWrite-Through
Redis検索結果2minCache-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 ShakingTBT, INP1.5MB→300KBP0
画像WebP/AVIF変換LCP5.8s→2.2sP0
Critical CSS インライン化FCP3.1s→1.0sP1
ISR導入(トップ/商品詳細)TTFB, LCPさらに改善P1
img width/height設定CLS0.35→0.05P1
フォントサブセット化FCP, CLS16MB→300KBP2
リスト仮想化INP450ms→100msP2
実施スケジュール:
Week 1: P0施策(バンドル最適化 + 画像最適化) → スコア65想定
Week 2: P1施策(CSS/ISR/CLS修正) → スコア80想定
Week 3: P2施策 + 検証 → スコア90+想定

まとめ

ポイント内容
ボトルネック分析リトルの法則で各レイヤーを定量的に評価
キャッシュ戦略多層キャッシュでDB負荷を75%削減
セール対策段階的な負荷テストと事前スケーリング
フロントエンドバンドル/画像/レンダリングの3軸で最適化

チェックリスト

  • ボトルネックマップを作成できた
  • キャッシュ戦略を設計できた
  • 負荷テスト計画とスケーリング戦略を策定できた
  • フロントエンド最適化の優先順位を付けられた

次のステップへ

最後は卒業クイズです。


推定読了時間: 90分