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