ストーリー
ミッション一覧
| # | ミッション | 難易度 | 推定時間 |
|---|---|---|---|
| 1 | オンライン銀行の振込システムを設計せよ | 応用 | 25分 |
| 2 | 航空券予約システムを設計せよ | 応用 | 25分 |
| 3 | スマート工場のIoT監視システムを設計せよ | 発展 | 20分 |
| 4 | グローバル分散データベースを設計せよ | 発展 | 20分 |
Mission 1: オンライン銀行の振込システム
要件
- 口座間の振込処理(同一銀行内 + 他行宛)
- 残高の一貫性保証(二重引き落とし禁止)
- 取引の完全な監査証跡
- 1日100万件の振込処理
- 可用性 99.99%
設計すべき項目
- 振込処理のトランザクション設計(Saga or 2PC)
- 冪等性の保証方法
- 他行振込の非同期処理(全銀ネット連携)
- 監査ログの設計
回答例
トランザクション設計: Sagaパターンを採用。
- 送金元口座の引き落とし(ローカルトランザクション)
- 送金先口座への入金(ローカルトランザクション)
- 失敗時は補償トランザクション(引き落とし額の戻し入れ)
冪等性: 振込リクエストIDをユニークキーとして管理。同一リクエストIDの再送時は既存結果を返す。
他行振込: メッセージキュー経由で非同期処理。全銀ネットのバッチウィンドウに合わせて送信。ステータスは「処理中→完了/失敗」で管理。
監査ログ: 全操作をイベントソーシングで記録。改ざん防止のため追記専用(Append-Only)。口座残高はイベントの集約から導出。
Mission 2: 航空券予約システム
要件
- 座席指定付きの予約
- 同一座席の二重予約防止
- 仮予約(15分の決済猶予)
- 国際フライトの時差対応
- ピーク時(セール時)5万同時アクセス
設計すべき項目
- 座席在庫管理のロック戦略
- 仮予約→決済→確定のフロー
- フライト検索の最適化
- セール時の高負荷対策
回答例
座席在庫管理: 悲観的ロック(SELECT FOR UPDATE)で座席単位のロック。座席テーブルに status カラム(AVAILABLE, RESERVED, BOOKED)を持つ。
予約フロー:
- 座席選択 → 悲観的ロックで座席確保 → status = RESERVED、15分TTL設定
- 決済画面へ遷移(15分以内)
- 決済成功 → status = BOOKED、チケット発行
- 15分経過 → スケジューラが status = AVAILABLE に戻す
検索最適化: フライト・日付・価格を事前集計してElasticsearchに格納。在庫数はRedisでリアルタイム管理。
高負荷対策: 仮想待合室(Queue-it方式)でフロント制御。リクエスト流量をバックエンドの処理能力内に制限。座席マップのキャッシュは5秒TTL。
Mission 3: スマート工場のIoT監視システム
要件
- 1万台の製造装置からのリアルタイムデータ収集
- 異常検知から3秒以内にアラート
- 装置故障の予知保全
- 生産ライン停止コマンドの送信
- データの7年間保存(法規制対応)
設計すべき項目
- テレメトリデータの収集と処理パイプライン
- リアルタイム異常検知のアルゴリズム
- 予知保全のためのMLモデル基盤
- 緊急停止コマンドの確実な配信
回答例
データ収集: 各装置 → エッジゲートウェイ(ローカル前処理) → MQTT → IoT Core → Kafka → Flink(ストリーム処理)。エッジで第一次フィルタリングを行い、帯域を最適化。
異常検知: 3層構造
- Layer 1 (エッジ): 単純閾値チェック(温度 > 100度で即座にローカルアラート)
- Layer 2 (ストリーム): 時系列パターン分析(直近5分の移動平均の急変)
- Layer 3 (バッチ): MLモデルによる予知保全(Random Forest / LSTM)
予知保全: 過去の故障データとテレメトリを教師データとして学習。故障確率が70%を超えたら保全アラート。モデルは月次で再学習。
緊急停止: MQTT QoS 2(Exactly Once配信)で送信。ネットワーク障害時はエッジゲートウェイが自律判断でローカル停止。ACKが返るまでリトライ。
Mission 4: グローバル分散データベース
要件
- 5リージョン(東京、シンガポール、フランクフルト、バージニア、サンパウロ)
- 各リージョンで読み書き可能
- 書き込み競合の自動解決
- RPO < 1秒、RTO < 30秒
- 1リージョン障害時もサービス継続
設計すべき項目
- データレプリケーション戦略
- 競合解決のアルゴリズム
- グローバルルーティングとフェイルオーバー
- 一貫性レベルの選択
回答例
レプリケーション: Active-Active構成。Raft/Paxosベースのコンセンサスプロトコルで3リージョン以上の合意で書き込みコミット。残り2リージョンには非同期伝播。
競合解決: リージョンシャーディング + CRDTの組み合わせ。
- ユーザーデータ: ユーザーの地域に基づくオーナーリージョンで書き込み
- カウンター系: CRDTのG-Counter/PN-Counterで競合なし集約
- その他: Lamport Timestampによるlast-write-wins
ルーティング: Anycast DNS + ヘルスチェック。障害検知後30秒以内にDNS更新。トラフィックは自動的に正常リージョンに振り分け。
一貫性: データ種別により選択。
- 決済データ: Quorum Read/Write(強い一貫性)
- ユーザープロファイル: 結果整合性(数秒のラグ許容)
- セッション: Sticky Sessionで同一リージョンに固定
達成チェックリスト
- Mission 1: 銀行振込システムの設計を完了した
- Mission 2: 航空券予約システムの設計を完了した
- Mission 3: IoT監視システムの設計を完了した
- Mission 4: グローバル分散データベースの設計を完了した
- 全てのミッションで可用性・一貫性・災害対策を考慮した
- トレードオフを明示的に記述した
次のステップへ
次はStep 4のチェックポイントです。ミッションクリティカルシステムの知識を確認しましょう。
推定所要時間: 90分