EXERCISE 90分

ストーリー

高橋アーキテクト
理論を学んだだけでは設計者にはなれない。実際に手を動かして設計してみよう
高橋アーキテクト
制限時間は各ミッション20-30分。4ステップフレームワークを使って、構造化された設計を行うんだ

ミッション一覧

#ミッション難易度推定時間
1Pastebin(テキスト共有サービス)を設計せよ基本20分
2Instagram風の画像共有SNSを設計せよ応用25分
3Uber風の配車サービスを設計せよ応用25分
4Googleドキュメント風のリアルタイム共同編集を設計せよ発展20分

Mission 1: Pastebinを設計せよ

要件

  • テキストを投稿し、一意のURLで共有できる
  • 有効期限の設定が可能
  • DAU 100万人、1日50万ペースト

設計すべき項目

  1. 規模の見積もり(QPS、ストレージ)
  2. ハイレベルアーキテクチャ図
  3. URLの一意性を保証する仕組み
  4. ストレージの選択(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万人

設計すべき項目

  1. 画像アップロードのフロー(クライアント→ストレージ)
  2. フィード生成の戦略(Push/Pull/Hybrid)
  3. 画像のリサイズとCDN配信
  4. ストレージコストの概算
回答例

画像アップロードフロー:

  1. クライアントがAPIサーバーに署名付きURLを要求
  2. クライアントがS3に直接アップロード(サーバー負荷回避)
  3. S3イベントがLambdaをトリガー → リサイズ(サムネイル/中/大)
  4. メタデータを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万)

設計すべき項目

  1. 位置情報のリアルタイム更新と保存
  2. 近くのドライバーを効率的に検索する仕組み
  3. マッチングのフロー
  4. ETA(到着予定時間)の計算
回答例

位置情報管理: ドライバーは4秒ごとに位置情報を送信。Redis GeoSetで管理(GEOADD/GEORADIUS)。

近接検索:

// Redis GeoSetで半径5km以内のドライバーを検索
const nearbyDrivers = await redis.georadius(
  'drivers:active', longitude, latitude, 5, 'km', 'WITHCOORD', 'COUNT', 20
);

マッチングフロー:

  1. 乗客がリクエスト送信
  2. 半径内のドライバーを検索(GeoSet)
  3. ETA、評価、受付率でスコアリング
  4. 上位ドライバーに順番にリクエスト送信(15秒タイムアウト)
  5. 受諾されたらマッチング成立

ETA計算: Google Maps API + 過去データの機械学習モデルで補正。


Mission 4: リアルタイム共同編集を設計せよ

要件

  • 複数ユーザーが同時にドキュメントを編集
  • 編集のリアルタイム反映
  • 競合の自動解決
  • 編集履歴とバージョン管理

設計すべき項目

  1. リアルタイム同期のプロトコル
  2. 競合解決アルゴリズム(OT vs CRDT)
  3. ドキュメントの永続化戦略
  4. カーソル位置の共有方法
回答例

同期プロトコル: 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分