ストーリー
ミッション一覧
| # | ミッション | 難易度 | 推定時間 |
|---|---|---|---|
| 1 | Pastebin(テキスト共有サービス)を設計せよ | 基本 | 20分 |
| 2 | Instagram風の画像共有SNSを設計せよ | 応用 | 25分 |
| 3 | Uber風の配車サービスを設計せよ | 応用 | 25分 |
| 4 | Googleドキュメント風のリアルタイム共同編集を設計せよ | 発展 | 20分 |
Mission 1: Pastebinを設計せよ
要件
- テキストを投稿し、一意のURLで共有できる
- 有効期限の設定が可能
- DAU 100万人、1日50万ペースト
設計すべき項目
- 規模の見積もり(QPS、ストレージ)
- ハイレベルアーキテクチャ図
- URLの一意性を保証する仕組み
- ストレージの選択(DB vs オブジェクトストレージ)
回答例
規模見積もり:
- 書き込みQPS: 500,000 / 86,400 = ~6 QPS
- 読み取りQPS(読み書き比率5): ~30 QPS
- 1ペーストの平均サイズ: 10KB
- 1日のストレージ: 500,000 * 10KB = 5GB/日
アーキテクチャ:
クライアント → LB → Webサーバー → メタデータDB (RDB)
→ コンテンツストレージ (S3)
→ キャッシュ (Redis)
URL生成: Base62エンコーディング + Snowflake ID。短いテキストはメタデータDBに、長いテキストはS3に保存。期限切れペーストはバッチジョブで定期削除。
Mission 2: Instagram風画像共有SNSを設計せよ
要件
- 画像のアップロードとフィード表示
- フォロー/フォロワー機能
- いいね・コメント機能
- DAU 5000万人
設計すべき項目
- 画像アップロードのフロー(クライアント→ストレージ)
- フィード生成の戦略(Push/Pull/Hybrid)
- 画像のリサイズとCDN配信
- ストレージコストの概算
回答例
画像アップロードフロー:
- クライアントがAPIサーバーに署名付きURLを要求
- クライアントがS3に直接アップロード(サーバー負荷回避)
- S3イベントがLambdaをトリガー → リサイズ(サムネイル/中/大)
- メタデータをDBに保存、フォロワーにFan-out
フィード戦略: ハイブリッド方式。フォロワー10,000未満はPush、以上はPull。Redis Sorted Setでフィードキャッシュ管理。
CDN: CloudFront/Fastlyで画像を配信。WebPフォーマットで容量30%削減。
ストレージ: 1画像平均500KB x 3サイズ = 1.5MB。5000万DAU x 0.5投稿/日 = 37.5TB/日。
Mission 3: Uber風配車サービスを設計せよ
要件
- 乗客がドライバーをリアルタイムで呼べる
- ドライバーの位置情報をリアルタイム追跡
- マッチングアルゴリズム
- DAU 1000万人(乗客500万 + ドライバー500万)
設計すべき項目
- 位置情報のリアルタイム更新と保存
- 近くのドライバーを効率的に検索する仕組み
- マッチングのフロー
- ETA(到着予定時間)の計算
回答例
位置情報管理: ドライバーは4秒ごとに位置情報を送信。Redis GeoSetで管理(GEOADD/GEORADIUS)。
近接検索:
// Redis GeoSetで半径5km以内のドライバーを検索
const nearbyDrivers = await redis.georadius(
'drivers:active', longitude, latitude, 5, 'km', 'WITHCOORD', 'COUNT', 20
);
マッチングフロー:
- 乗客がリクエスト送信
- 半径内のドライバーを検索(GeoSet)
- ETA、評価、受付率でスコアリング
- 上位ドライバーに順番にリクエスト送信(15秒タイムアウト)
- 受諾されたらマッチング成立
ETA計算: Google Maps API + 過去データの機械学習モデルで補正。
Mission 4: リアルタイム共同編集を設計せよ
要件
- 複数ユーザーが同時にドキュメントを編集
- 編集のリアルタイム反映
- 競合の自動解決
- 編集履歴とバージョン管理
設計すべき項目
- リアルタイム同期のプロトコル
- 競合解決アルゴリズム(OT vs CRDT)
- ドキュメントの永続化戦略
- カーソル位置の共有方法
回答例
同期プロトコル: WebSocketで双方向通信。各操作をOperation(挿入/削除/書式変更)として送受信。
競合解決:
- OT(Operational Transformation): サーバーが操作を変換して適用順序を調整。Google Docsで使用。
- CRDT(Conflict-free Replicated Data Type): データ構造自体が競合を解決。Figma等で使用。
- 推奨: OTの方が実装事例が多く、テキスト編集に適している。
永続化: 操作はイベントログとして保存。定期的にスナップショットを取得(5分間隔)。ドキュメント取得時は最新スナップショット + 以降の操作を適用。
カーソル共有: WebSocket経由でカーソル位置と選択範囲をブロードキャスト。色でユーザーを区別。
達成チェックリスト
- Mission 1: Pastebinの設計を完了した
- Mission 2: 画像共有SNSの設計を完了した
- Mission 3: 配車サービスの設計を完了した
- Mission 4: リアルタイム共同編集の設計を完了した
- 全てのミッションで4ステップフレームワークを適用した
- トレードオフを明示的に議論した
次のステップへ
次はStep 2のチェックポイントです。ケーススタディで学んだ知識を確認しましょう。
推定所要時間: 90分