ストーリー
高橋アーキテクト が真剣な表情で言いました。
クイズ(8問)
合格ライン: 80%(8問中7問正解)
Q1. 2フェーズコミット(2PC)がマイクロサービスに不向きな理由として最も適切なのはどれか?
- A: 実装が簡単すぎて柔軟性がない
- B: 同期的なブロッキングとCoordinatorの単一障害点
- C: NoSQLデータベースでのみ動作する
- D: イベント駆動と互換性がない
回答と解説
正解: B
2PCはPrepareフェーズからCommitフェーズまですべての参加者がロックを保持する同期的ブロッキングが発生し、パフォーマンスが低下します。また、Coordinatorがダウンすると全体が停止する単一障害点となります。マイクロサービスの独立性と可用性の原則に反します。
Q2. Sagaパターンの「ACD特性」でACIDから欠けているのはどれか?
- A: Atomicity
- B: Consistency
- C: Isolation
- D: Durability
回答と解説
正解: C
SagaにはIsolation(分離性)がありません。Sagaの実行中に中間状態が他のトランザクションから見える可能性があります。例えば、注文が「PENDING」状態の間に別のリクエストがその注文を参照できてしまいます。これを緩和するためにセマンティックロックなどのカウンターメジャーを使用します。
Q3. ChoreographyよりOrchestrationが適切な場面はどれか?
- A: ステップ数が3つ以下のシンプルなフロー
- B: 各サービスチームが完全に独立している
- C: ステップ数が多く複雑な条件分岐がある
- D: イベント駆動アーキテクチャが導入済み
回答と解説
正解: C
Orchestrationはステップ数が多く(5以上)、複雑な条件分岐があるフローに適しています。中央のOrchestratorがフロー全体を管理するため、可視性が高くデバッグも容易です。シンプルなフローやチームの独立性を重視する場合はChoreographyが適切です。
Q4. 補償トランザクションについて正しい記述はどれか?
- A: データベースのROLLBACKと同じ動作をする
- B: ビジネスロジックとして「打ち消す操作」を実行し、履歴は残る
- C: 補償は常に自動的に成功する
- D: 補償は冪等でなくてもよい
回答と解説
正解: B
補償トランザクションはDBのROLLBACKとは異なり、ビジネスロジックとして打ち消す操作を実行します。例えば、決済の補償は「返金」であり、決済履歴と返金履歴の両方が残ります。また、補償自体もリトライされる可能性があるため冪等性が必要です。
Q5. 不可逆な操作(メール送信等)をSagaで扱う最適な戦略はどれか?
- A: 不可逆な操作を含むSagaは実装しない
- B: 不可逆な操作をSagaの最後のステップに配置する
- C: 不可逆な操作の前に必ず確認ダイアログを表示する
- D: 不可逆な操作は同期的に実行する
回答と解説
正解: B
不可逆な操作(メール送信、SMS送信等)はSagaの最後のステップに配置します。これにより、先行するステップがすべて成功した後にのみ実行されるため、補償が必要になるリスクを最小化できます。
Q6. Outboxパターンが解決する問題はどれか?
- A: データベースの性能問題
- B: DBへの書き込みとイベント発行の二重書き込み問題
- C: メッセージブローカーの順序保証
- D: サービスディスカバリの信頼性
回答と解説
正解: B
Outboxパターンは、DBへのビジネスデータの書き込みとイベントの発行を、同一のDBトランザクション内で実行することで、「一方だけ成功」という不整合を防ぎます。OutboxテーブルにイベントをINSERTし、別プロセスでメッセージブローカーに転送します。
Q7. Outboxの転送方式としてCDC(Change Data Capture)を選ぶ利点はどれか?
- A: 実装がシンプルで追加コンポーネントが不要
- B: ほぼリアルタイムでイベントを転送でき、DBへのクエリ負荷が低い
- C: すべてのデータベースで標準サポートされている
- D: メッセージの順序が完全に保証される
回答と解説
正解: B
CDCはDBの変更ログ(WAL/binlog)を監視するため、ポーリングと比較してほぼリアルタイムでイベントを検出・転送でき、DBへの追加のクエリ負荷もかかりません。ただし、Debezium等の追加コンポーネントの導入・運用が必要です。
Q8. セマンティックロックの目的はどれか?
- A: データベースのデッドロックを防止する
- B: Sagaの中間状態を示すフラグで、並行する操作を制御する
- C: メッセージブローカーのパーティションをロックする
- D: サービス間のAPI呼び出しをシリアライズする
回答と解説
正解: B
セマンティックロックは、Sagaの実行中であることを示すフラグ(例: status = “APPROVAL_PENDING”)をエンティティに設定し、中間状態にあるデータに対する並行操作を制御します。Sagaが完了するまで、他のリクエストからの変更を防ぐことで、Isolation不足によるデータ不整合を緩和します。
結果判定
合格(7問以上正解)
Sagaパターンと分散トランザクションの知識をしっかり習得しています。Step 5に進んで、CQRSと結果整合性を学びましょう。
不合格(6問以下)
Step 4の各レッスンを復習しましょう。特にChoreography/Orchestrationの選択基準と補償トランザクションの設計原則を重点的に見直してください。
推定所要時間: 30分