ストーリー
ミッション概要
| ミッション | テーマ | 目安時間 |
|---|---|---|
| Mission 1 | モノリス vs マイクロサービスの評価 | 15分 |
| Mission 2 | イベント駆動通信の設計 | 15分 |
| Mission 3 | コンピュートプラットフォームの選択 | 15分 |
| Mission 4 | CQRSによるデータアーキテクチャ | 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 サーバーレス)を選択してください。
解答例
| サービス | プラットフォーム | 理由 |
|---|---|---|
| 注文API | Kubernetes(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%) | 2 | 3 | 5 |
| 開発速度(20%) | 4 | 3 | 2 |
| 運用性(20%) | 5 | 4 | 2 |
| チーム独立性(15%) | 2 | 3 | 5 |
| 将来の拡張性(10%) | 2 | 4 | 5 |
| コスト(10%) | 5 | 4 | 2 |
| 加重スコア | 3.15 | 3.35 | 3.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分