クイズの説明
Step 4「分散トランザクションを実装する」で学んだ内容の理解度を確認します。全8問、80%(7問)以上正解で合格です。
問題
Q1. CAP定理について正しい説明はどれですか?
- A) Consistency、Availability、Performance の3つを同時に満たせない
- B) ネットワーク分断は回避できるため、CとAの両方を実現できる
- C) ネットワーク分断は避けられないため、実質的にCかAの選択になる
- D) 分散システムでは常にConsistencyを優先すべき
答えを見る
正解: C
CAP定理のPはPartition Tolerance(ネットワーク分断耐性)です。分散システムではネットワーク分断は必ず発生するため、Pは必須です。結果として、分断発生時にConsistency(全ノードが同じデータ)かAvailability(全リクエストが応答を返す)かの選択になります。
Q2. BASE のうち「Eventually Consistent」が意味するものはどれですか?
- A) データは常に最新状態を保つ
- B) 更新が停止すれば、いずれ全レプリカが同じ値に収束する
- C) トランザクション分離レベルがSERIALIZABLEである
- D) 書き込みは即座に全ノードに反映される
答えを見る
正解: B
Eventually Consistent(結果整合性)は、更新が停止すれば最終的に全レプリカが同じ値に収束することを意味します。即座の整合性は保証しませんが、ビジネス上許容できるケース(商品カタログの在庫表示など)では、可用性とパフォーマンスの向上と引き換えに採用されます。
Q3. Transactional Outbox パターンが解決する問題はどれですか?
- A) データベースのパフォーマンス問題
- B) DBへの書き込みとイベント発行の原子性(Dual Write問題)
- C) メッセージブローカーのスケーラビリティ
- D) サービス間の認証問題
答えを見る
正解: B
Outboxパターンは、ビジネスデータのDB書き込みとイベント発行を同一トランザクションで行うことで、Dual Write問題を解決します。イベントをOutboxテーブルに書き込み、CDC(Change Data Capture)やポーリングでメッセージブローカーに転送します。
Q4. Sagaにおける「ピボットトランザクション」の特徴はどれですか?
- A) Sagaの最初に実行されるトランザクション
- B) 最も処理時間が長いトランザクション
- C) 補償不可能で、成功すればSagaは完了に向かうトランザクション
- D) 全てのサービスが参加するトランザクション
答えを見る
正解: C
ピボットトランザクションは補償不可能なステップです。例えば外部決済APIへの課金は完了後にロールバックできません(返金は別の新規トランザクション)。ピボットより前のステップはCompensatable、後のステップはRetriableとして設計し、ピボット成功でSagaの前進が確定します。
Q5. 冪等性を実現する最も信頼性の高い方法はどれですか?
- A) メッセージにTTLを設定して古いメッセージを破棄する
- B) 処理済みメッセージIDをDBに記録し、重複をスキップする
- C) Consumer側でメッセージをメモリにキャッシュする
- D) Producer側で重複送信を防止する
答えを見る
正解: B
処理済みメッセージIDのDB記録(Inboxパターン)が最も信頼性が高い方法です。ビジネスロジックの実行と処理済み記録を同一トランザクションで行うことで、冪等性を保証します。メモリキャッシュは再起動で失われ、Producer側の防止はat-most-onceにしかなりません。
Q6. CDC(Change Data Capture)で最も一般的に使用される仕組みはどれですか?
- A) アプリケーションログの解析
- B) データベースのWAL(Write-Ahead Log)の監視
- C) 定期的なテーブルスキャン
- D) トリガーによるイベントテーブルへの書き込み
答えを見る
正解: B
Debeziumなどの主要なCDCツールは、データベースのWAL(PostgreSQLのWAL、MySQLのBinlog)を監視して変更を検知します。これにより、アプリケーションコードへの変更なしに、DB操作をリアルタイムでイベントストリームに変換できます。テーブルスキャンは遅延が大きく、トリガーはDB負荷が高くなります。
Q7. Sagaのセマンティックロックの目的はどれですか?
- A) データベースのデッドロックを防止する
- B) Saga実行中のデータを他のSagaから保護し、Lost Updateを防止する
- C) メッセージブローカーの順序を保証する
- D) サービス間の通信を暗号化する
答えを見る
正解: B
セマンティックロックは、Saga実行中のエンティティにステータスフラグ(例: PROCESSING)を設定し、他のSagaからの同時更新を防止するパターンです。DBの物理ロックではなく、ビジネスロジックレベルで排他制御を行うため、長時間のロック保持を避けられます。
Q8. Outboxパターンの「Polling Publisher」と「CDC」の最大の違いはどれですか?
- A) 使用するプログラミング言語
- B) リアルタイム性(CDCはWAL監視で即時、PollingはInterval依存で遅延)
- C) 対応するデータベースの種類
- D) セキュリティレベル
答えを見る
正解: B
CDCはDBのWALを監視するため、変更をほぼリアルタイムに検知できます。一方、Polling Publisherは定期間隔(例: 5秒)でOutboxテーブルを読み取るため、最大でポーリング間隔分の遅延が発生します。CDCの方がリアルタイム性とDB負荷の面で優れますが、Debezium等の追加インフラが必要です。
結果
7問以上正解の場合
合格です。 分散トランザクションの課題と解決策を理解しています。
「分散トランザクションを制する者が、マイクロサービスを制する。次はサービスメッシュの世界へ進もう」 — 佐藤CTO
6問以下の場合
もう少し復習しましょう。
- Q1-Q2を間違えた場合 → Step 4-1「分散システムの課題」を復習
- Q3-Q4を間違えた場合 → Step 4-3/4-4「補償トランザクションとOutbox」を復習
- Q5-Q8を間違えた場合 → Step 4-2「SagaとOutbox」を復習