EXERCISE 90分

ストーリー

高橋アーキテクト
これがL2最後のミッションだ
あなた
10ヶ月間で学んだ全てを注ぎ込んで、グローバルECプラットフォームを設計してほしい。API設計、データベース、認証、パフォーマンス、セキュリティ、分散システム…全てが試される
高橋アーキテクト
制限時間は90分。実際のシステム設計面接と同じ条件だ。フレームワークに従って、構造化された設計を行え

ミッション概要

項目内容
システムグローバルECプラットフォーム
対象市場日本、北米、欧州、東南アジア
推定時間90分
提出物設計ドキュメント(以下の8セクション)

ビジネス要件

あなたの会社は、以下の要件でグローバルECプラットフォームを構築することになりました。

機能要件

  1. 商品管理: カタログ管理、在庫管理、マルチ言語対応
  2. 検索: 全文検索、ファセット検索、オートコンプリート
  3. カート・注文: カート管理、注文処理、注文履歴
  4. 決済: クレジットカード、銀行振込、地域ごとの決済手段
  5. 配送: 配送先管理、配送状況追跡、複数の配送業者
  6. ユーザー管理: 認証、プロファイル、注文履歴
  7. レコメンデーション: パーソナライズされた商品推薦
  8. 通知: 注文確認、配送状況、プロモーション

非機能要件

  • DAU: 5000万人(4リージョン合計)
  • 商品数: 5000万SKU
  • ピーク時注文数: 10,000件/秒(セール時)
  • 検索レイテンシ: p99 < 200ms
  • 決済レイテンシ: p99 < 2秒
  • 可用性: 99.99%
  • データの地域規制対応(GDPR、個人情報保護法)

設計タスク

Section 1: 要件分析と規模見積もり(10分)

以下を概算せよ。

  • 1日のリクエスト数(読み取り/書き込み別)
  • ストレージ要件(商品データ、注文データ、画像)
  • 帯域幅要件
  • 必要なサーバー台数の概算
ヒントと回答例

概算:

  • 読み取りQPS: 5000万DAU x 20回/日 / 86400 = ~11,500 QPS(ピーク3倍 = 34,500)
  • 書き込みQPS: 注文10,000/秒(ピーク) + カート更新 + 検索ログ = ~15,000 QPS
  • 商品データ: 5000万 x 10KB = 500GB
  • 画像: 5000万 x 5枚 x 500KB = 125TB
  • 注文データ: 1日500万件 x 2KB = 10GB/日、年3.6TB
  • 帯域幅: ピーク時100Gbps以上

Section 2: ハイレベルアーキテクチャ(15分)

システム全体のコンテナ図(C4 Level 2)を設計せよ。主要なサービス、データストア、メッセージキューを含めること。

ヒントと回答例
graph TD
    CDN["CDN/Edge"] --> GW["API Gateway"]
    GW --> Auth["認証サービス"]
    GW --> Prod["商品サービス"]
    GW --> Ord["注文サービス"]
    GW --> Search["検索サービス"]
    GW --> User["ユーザーサービス"]
    GW --> Rec["レコメンドサービス"]

    Prod --> ProdDB[("商品DB<br/>PostgreSQL")]
    Ord --> OrdDB[("注文DB<br/>PostgreSQL")]
    Search --> ES[("Elasticsearch")]
    User --> UserDB[("ユーザーDB")]
    Rec --> ML["MLモデル"]
    Rec --> FS[("特徴量Store")]

    Prod --> Inv["在庫サービス"]
    Inv --> InvDB[("在庫DB<br/>Redis + PostgreSQL")]

    Pay["決済サービス"] --> Ledger[("台帳DB")]
    Ledger --> PSP["外部PSP<br/>Stripe等"]
    Ship["配送サービス"] --> ShipDB[("配送DB")]
    ShipDB --> ShipAPI["外部配送API"]
    Notif["通知サービス"] --> Kafka["Kafka"]
    Kafka --> Workers["Push/Email/SMS Workers"]

    S3["画像ストレージ:<br/>S3 + CloudFront CDN"]
    Redis["セッション/キャッシュ:<br/>Redis Cluster"]
    Analytics["分析基盤:<br/>Kafka → S3 → BigQuery"]

Section 3: データモデル設計(10分)

主要エンティティ(商品、注文、ユーザー)のスキーマと、データストアの選定理由を記述せよ。

ヒントと回答例

商品サービス: PostgreSQL

  • products: id, name(jsonb/多言語), description(jsonb), category_id, brand_id, price, currency, status
  • product_variants: id, product_id, sku, attributes(jsonb), stock_quantity
  • categories: id, parent_id, name(jsonb) (ネストされたカテゴリ)

注文サービス: PostgreSQL

  • orders: id, user_id, status, total_amount, currency, shipping_address_id, created_at
  • order_items: id, order_id, product_id, variant_id, quantity, unit_price
  • payments: id, order_id, amount, status, provider, idempotency_key

検索: Elasticsearch(商品の全文検索 + ファセット) 在庫: Redis(リアルタイム在庫カウント) + PostgreSQL(永続化) セッション: Redis(TTL付き)

Section 4: API設計(10分)

主要なAPIエンドポイントを5つ以上設計し、OpenAPI形式で記述せよ。

ヒントと回答例
# 商品検索
GET /api/v1/products/search?q={query}&category={id}&price_min={min}&price_max={max}&page={n}
→ 200: { items: Product[], facets: Facet[], total: number }

# 商品詳細
GET /api/v1/products/{productId}
→ 200: { product: Product, variants: Variant[], recommendations: Product[] }

# カートに追加
POST /api/v1/cart/items
Body: { productId, variantId, quantity }
→ 201: { cart: Cart } (冪等性キー: X-Idempotency-Key ヘッダー)

# 注文作成
POST /api/v1/orders
Body: { cartId, shippingAddressId, paymentMethodId }
→ 201: { order: Order, paymentUrl: string }

# 注文ステータス取得
GET /api/v1/orders/{orderId}
→ 200: { order: Order, items: OrderItem[], tracking: TrackingInfo }

認証: Bearer Token (JWT)。レート制限: 認証済み100req/min、未認証20req/min。

Section 5: スケーラビリティ設計(10分)

ピーク時のトラフィックに耐えるためのスケーリング戦略を記述せよ。

ヒントと回答例

アプリケーション層:

  • ステートレス設計 + Auto Scaling(CPU 60%で自動スケールアウト)
  • セール時は事前にPre-warmingで最低台数を増加

データベース:

  • 読み書き分離(Writer 1台 + Reader N台)
  • 注文テーブルは月次パーティショニング
  • ホットスポット(人気商品の在庫)はRedisで吸収

検索:

  • Elasticsearch: 5シャード x 2レプリカ(10ノード)
  • 検索結果キャッシュ(Redis、TTL 30秒)

キャッシュ戦略:

  • L1: アプリケーション内キャッシュ(商品マスタ、TTL 5分)
  • L2: Redis Cluster(セッション、カート、在庫)
  • L3: CDN(静的アセット、商品画像)

Section 6: 決済とデータ一貫性(10分)

決済フローの設計と、注文-在庫-決済間のデータ一貫性の保証方法を記述せよ。

ヒントと回答例

決済フロー:

  1. 注文作成 → 在庫の仮確保(悲観的ロック)
  2. 決済リクエスト → 外部PSPに Authorization
  3. 決済成功 → 在庫確定、注文ステータスを CONFIRMED に変更
  4. 決済失敗 → 在庫の仮確保を解放、注文を CANCELLED に変更

一貫性保証: Sagaパターン(Orchestration方式)

  • 注文サービスがオーケストレーター
  • 各ステップが失敗した場合の補償トランザクション定義
  • 冪等性キーで二重処理を防止

Transactional Outbox パターン:

  • 注文DBの更新とイベント発行をアトミックに実行
  • Outboxテーブルに書き込み → CDC(Change Data Capture)でKafkaに配信

Section 7: マルチリージョン・セキュリティ(15分)

4リージョン展開のデータレプリケーション戦略と、GDPR対応を含むセキュリティ設計を記述せよ。

ヒントと回答例

マルチリージョン:

  • Read Local, Write Global方式
  • 商品データ: グローバルレプリケーション(全リージョンで読み取り可能)
  • 注文/ユーザーデータ: リージョンシャーディング(ユーザーの地域に基づくオーナーリージョン)
  • 検索インデックス: 各リージョンにローカルレプリカ

GDPR対応:

  • 個人情報はEU内のリージョンに保存(データレジデンシー)
  • データ削除要求(忘れられる権利)への対応: ソフトデリート + 30日後の物理削除
  • 同意管理: 明示的なオプトインの記録と管理
  • データポータビリティ: エクスポートAPI

セキュリティ:

  • ゼロトラストアーキテクチャ(サービス間mTLS)
  • PCI DSS準拠(決済データのトークナイゼーション)
  • WAF + DDoS対策(AWS Shield Advanced)
  • 暗号化: 転送中(TLS 1.3)+ 保存時(AES-256)

Section 8: 運用設計と監視(10分)

監視、アラート、障害対応の設計を記述せよ。

ヒントと回答例

SLI/SLO:

  • API可用性: SLO 99.99%、SLI = 成功レスポンス率
  • 検索レイテンシ: SLO p99 < 200ms、SLI = APIレスポンスタイム
  • 決済成功率: SLO > 99.5%、SLI = 決済完了率

監視スタック:

  • メトリクス: Datadog(インフラ + APM)
  • ログ: CloudWatch Logs → S3 → Athena
  • 分散トレーシング: OpenTelemetry + Jaeger
  • リアルタイムダッシュボード: Grafana

アラート:

  • P1(即時対応): 可用性 < 99.9%、決済エラー率 > 1%
  • P2(1時間以内): レイテンシ p99 > 500ms、エラー率 > 0.5%
  • P3(営業時間内): ディスク使用率 > 80%、証明書期限30日以内

障害対応:

  • ランブック(手順書)の整備
  • On-callローテーション(PagerDuty)
  • ポストモーテム文化(障害後の振り返りと改善)

採点基準

セクション配点評価ポイント
要件分析と規模見積もり10点概算の妥当性、主要メトリクスの網羅性
ハイレベルアーキテクチャ15点コンポーネントの適切な分割、データフローの明確さ
データモデル設計10点スキーマの適切さ、データストア選定の理由
API設計10点RESTful原則の遵守、エラー処理、認証設計
スケーラビリティ設計15点キャッシュ戦略、スケーリング戦略の妥当性
決済とデータ一貫性15点Sagaパターン、冪等性、補償トランザクション
マルチリージョン・セキュリティ15点レプリケーション、GDPR対応、暗号化
運用設計と監視10点SLI/SLO、監視スタック、障害対応
  • 80点以上: 合格(設計者としての総合力を証明)
  • 60-79点: 条件付き合格(弱い分野の復習を推奨)
  • 59点以下: 不合格(該当月の復習が必要)

達成チェックリスト

  • Section 1: 規模見積もりを完了した
  • Section 2: ハイレベルアーキテクチャを描いた
  • Section 3: データモデルを設計した
  • Section 4: API設計を行った
  • Section 5: スケーラビリティ戦略を記述した
  • Section 6: 決済とデータ一貫性を設計した
  • Section 7: マルチリージョンとセキュリティを設計した
  • Section 8: 運用設計を記述した

次のステップへ

最後に、L2修了認定試験(卒業クイズ)に挑戦しましょう。


推定所要時間: 90分