EXERCISE 90分

ストーリー

佐藤CTO
理論を学んだら次は実践だ
佐藤CTO
急成長中のスタートアップが次世代プラットフォームのアーキテクチャを決定しなければならない。複数の選択肢を公平に評価し、最適な判断を下してほしい

ミッション概要

ミッションテーマ目安時間
Mission 1モノリス vs マイクロサービスの評価15分
Mission 2イベント駆動通信の設計15分
Mission 3コンピュートプラットフォームの選択15分
Mission 4CQRSによるデータアーキテクチャ15分
Mission 5比較マトリクスの作成15分
Mission 6アーキテクチャ推奨書の作成15分

前提シナリオ

企業: フードデリバリースタートアップ「QuickEats」
現状: モノリシックアプリケーション(Ruby on Rails)
課題: 注文数が月50万件→200万件に急増予定
チーム: エンジニア15名(3チーム)
要件:
  - リアルタイム配達追跡
  - 複数の決済プロバイダー対応
  - レストランパートナー向けダッシュボード
  - プッシュ通知
  - レコメンデーションエンジン

Mission 1: モノリス vs マイクロサービスの評価(15分)

要件

現在のモノリスを維持する場合と、マイクロサービスに移行する場合のメリット・デメリットを分析してください。Modular Monolithも選択肢に含めること。

解答例
評価軸モノリス維持Modular Monolithマイクロサービス
開発速度(短期)◎ 変更不要○ リファクタ必要△ 大幅な再設計
開発速度(長期)△ 肥大化で低下○ モジュール境界で維持◎ 独立デプロイ
スケーラビリティ△ 全体スケール○ モジュール単位で最適化◎ サービス単位
チーム独立性△ コード競合○ モジュール所有権◎ 完全独立
運用複雑性◎ シンプル◎ シンプル△ 分散システム管理
データ整合性◎ 単一DB◎ 単一DB△ 結果整合性

推奨: チーム規模(15名)を考慮すると、まずModular Monolithに移行し、成長に応じて段階的にサービス分離するアプローチが現実的。


Mission 2: イベント駆動通信の設計(15分)

要件

注文フロー(注文→決済→レストラン通知→配達手配→追跡)をイベント駆動で設計してください。

解答例
graph TD
    OP["OrderPlaced"]
    PS["PaymentService"]
    PP["PaymentProcessed"]
    PF["PaymentFailed"]
    RS["RestaurantService"]
    OA["OrderAccepted"]
    OR["OrderRejected"]
    DS["DeliveryService<br/>DriverAssigned"]
    TS["TrackingService<br/>LocationUpdated(リアルタイム)"]
    NS["NotificationService<br/>PushNotification"]

    OP --> PS
    PS --> PP
    PS --> PF
    PP --> RS
    RS --> OA
    RS --> OR
    OA --> DS --> TS --> NS
// イベント例:
{
  "type": "OrderPlaced",
  "data": {
    "orderId": "ord-123",
    "customerId": "cust-456",
    "restaurantId": "rest-789",
    "items": ["..."],
    "totalAmount": 2500
  },
  "metadata": {
    "timestamp": "2026-01-15T12:00:00Z",
    "correlationId": "corr-abc"
  }
}
メッセージブローカー選定:
  - 注文フロー: Apache Kafka(順序保証、永続化)
  - リアルタイム追跡: Redis Pub/Sub(低レイテンシ)
  - 通知: Amazon SQS(簡易キュー)

Mission 3: コンピュートプラットフォームの選択(15分)

要件

各サービス/機能に最適なコンピュートプラットフォーム(コンテナ vs サーバーレス)を選択してください。

解答例
サービスプラットフォーム理由
注文APIKubernetes(EKS)常時トラフィック、低レイテンシ要求
決済処理Kubernetes(EKS)常時稼働、PCI DSS準拠
レストランダッシュボードコンテナ(ECS)中程度のトラフィック
レコメンデーションLambda + SageMakerバッチ処理、イベント駆動
プッシュ通知Lambda + SNSイベント駆動、バースト対応
画像リサイズLambdaイベント駆動、短時間処理
リアルタイム追跡EKS + WebSocket常時接続、低レイテンシ

Mission 4: CQRSによるデータアーキテクチャ(15分)

要件

注文管理システムにCQRSパターンを適用し、書き込みと読み取りのモデルを設計してください。

解答例
graph LR
    subgraph コマンド側(書き込み)
        PG[("PostgreSQL<br/>正規化モデル<br/>orders, order_items,<br/>payments, deliveries")]
    end

    subgraph クエリ側(読み取り)
        ES[("Elasticsearch")]
        RD[("Redis")]
    end

    subgraph ビュー例
        V1["customer_order_history<br/>顧客の注文履歴(結合済み)"]
        V2["restaurant_dashboard<br/>レストラン向け集計データ"]
        V3["delivery_tracking<br/>配達追跡用リアルタイムデータ"]
    end

    PG -->|"Debezium(CDC)"| KF["Kafka"]
    KF --> ES
    KF --> RD
    ES --- V1
    ES --- V2
    RD --- V3
遅延: 数百ミリ秒〜数秒(結果整合性)

Mission 5: 比較マトリクスの作成(15分)

要件

3つのアーキテクチャ案をスコアリングしてください。

解答例
評価軸(重み)案A: モノリス改善案B: Modular Monolith案C: マイクロサービス
スケーラビリティ(25%)235
開発速度(20%)432
運用性(20%)542
チーム独立性(15%)235
将来の拡張性(10%)245
コスト(10%)542
加重スコア3.153.353.35

Mission 6: アーキテクチャ推奨書の作成(15分)

要件

評価結果を踏まえ、QuickEatsへのアーキテクチャ推奨を1ページにまとめてください。

解答例
# アーキテクチャ推奨: QuickEats次世代プラットフォーム

## 推奨: 段階的マイクロサービス移行(Strangler Fig)

### Phase 1(0-6ヶ月): Modular Monolith化
- 既存コードをドメイン境界でモジュール分割
- イベントバスの導入(モジュール間通信)

### Phase 2(6-12ヶ月): 高優先度サービスの分離
- リアルタイム追跡サービスの独立
- 決済サービスの独立(PCI DSS準拠)

### Phase 3(12-18ヶ月): 完全移行
- 残りのサービス分離
- サービスメッシュ導入

### リスクと対策
- 分散システムの複雑性 → SREプラクティス導入
- データ整合性 → Sagaパターン採用
- チームスキル → 段階的な学習期間確保

まとめ

ポイント内容
公平な評価感覚ではなくスコアリングで判断する
段階的アプローチ一度に全てを変えずに段階的に移行する
コンテキスト重視チーム規模・スキルに合った選択をする
文書化判断の根拠を記録し共有する

チェックリスト

  • 複数のアーキテクチャスタイルを比較評価できた
  • イベント駆動設計のフローを設計できた
  • コンピュートプラットフォームの選定ができた
  • CQRSパターンを適用できた
  • 加重スコアリングで意思決定できた

次のステップへ

次はチェックポイントクイズです。アーキテクチャスタイルの理解度を確認しましょう。


推定読了時間: 90分