LinuCレベル4 システムアーキテクト システムアーキテクチャ 問1
システムアーキテクチャ/アーキテクチャの設計原則と主要パターン注文・在庫・決済の各サービスがそれぞれ専用のデータベースを持つマイクロサービス構成で、注文処理全体の整合性をSagaパターンで保つことにした。Sagaの設計に関する説明として適切でないものはどれか。
当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「システムアーキテクチャ」に対応。実際の試験問題ではありません)
- A各ステップのローカルトランザクションに対し、後続ステップが失敗したときに打ち消す補償トランザクションを用意する
- B補償トランザクションは再実行されることがあるため、何度実行しても結果が同じになるよう冪等に設計する
- C各ローカルトランザクションの結果はSaga全体の完了まで他の処理から見えないため、分離性を考慮する必要はない
- DSaga全体の実行状況を記録しておき、途中で障害が起きても処理の再開または補償の続行ができるようにする
正解:C
解説
Sagaでは、各サービスのローカルトランザクションはそれぞれが独立したACIDトランザクションとしてその場でコミットされます。一方、それらを束ねたSaga全体は単一のACIDトランザクションではなく、特に分離性(I)を持ちません。各ローカルトランザクションが確定した時点でその結果は他の処理から見えるため、Saga全体が終わる前の中間状態が外部に露出します。したがって「Saga全体の完了まで結果が見えない」という前提は誤りで、「保留中」のような状態を持たせる、更新前に再読込するといった対策(セマンティックロックなど)を設計で補う必要があります。失敗時は、確定済みのステップを補償トランザクションで業務的に打ち消して整合性を回復します。2相コミットのように全参加者のロックを保持し続けないため、長時間にわたる業務処理に向いています。この設問は「適切でない(=誤っている)説明」を選ぶ形式です。
選択肢ごとの解説
- A記述は正しく、補償トランザクションの説明として適切です。設問が問う「適切でない説明」ではありません。
- B記述は正しく、補償は再試行で複数回届きうるため冪等に作るのが原則です。適切な説明なので答えではありません。
- C正しい。これが設問の答え(適切でない説明)です。各ローカルトランザクションは即座にコミットされ、その結果はSaga全体の完了を待たずに他から見えます。Saga全体は分離性(I)を持たないため、「完了まで結果が見えないので分離性を考慮しなくてよい」という記述は誤りです。
- D記述は正しく、実行状況を永続化して再開や補償の続行を可能にするのは適切です。答えではありません。