ストーリー
ミッション概要
| 項目 | 内容 |
|---|---|
| システム | グローバルECプラットフォーム |
| 対象市場 | 日本、北米、欧州、東南アジア |
| 推定時間 | 90分 |
| 提出物 | 設計ドキュメント(以下の8セクション) |
ビジネス要件
あなたの会社は、以下の要件でグローバルECプラットフォームを構築することになりました。
機能要件
- 商品管理: カタログ管理、在庫管理、マルチ言語対応
- 検索: 全文検索、ファセット検索、オートコンプリート
- カート・注文: カート管理、注文処理、注文履歴
- 決済: クレジットカード、銀行振込、地域ごとの決済手段
- 配送: 配送先管理、配送状況追跡、複数の配送業者
- ユーザー管理: 認証、プロファイル、注文履歴
- レコメンデーション: パーソナライズされた商品推薦
- 通知: 注文確認、配送状況、プロモーション
非機能要件
- 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分)
決済フローの設計と、注文-在庫-決済間のデータ一貫性の保証方法を記述せよ。
ヒントと回答例
決済フロー:
- 注文作成 → 在庫の仮確保(悲観的ロック)
- 決済リクエスト → 外部PSPに Authorization
- 決済成功 → 在庫確定、注文ステータスを CONFIRMED に変更
- 決済失敗 → 在庫の仮確保を解放、注文を 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分