過去問ドリル

LinuCレベル4 システムアーキテクト システムアーキテクチャ 問1

システムアーキテクチャ/アーキテクチャの設計原則と主要パターン

注文・在庫・決済の各サービスがそれぞれ専用のデータベースを持つマイクロサービス構成で、注文処理全体の整合性をSagaパターンで保つことにした。Sagaの設計に関する説明として適切でないものはどれか。

当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「システムアーキテクチャ」に対応。実際の試験問題ではありません)

正解:C

解説

Sagaでは、各サービスのローカルトランザクションはそれぞれが独立したACIDトランザクションとしてその場でコミットされます。一方、それらを束ねたSaga全体は単一のACIDトランザクションではなく、特に分離性(I)を持ちません。各ローカルトランザクションが確定した時点でその結果は他の処理から見えるため、Saga全体が終わる前の中間状態が外部に露出します。したがって「Saga全体の完了まで結果が見えない」という前提は誤りで、「保留中」のような状態を持たせる、更新前に再読込するといった対策(セマンティックロックなど)を設計で補う必要があります。失敗時は、確定済みのステップを補償トランザクションで業務的に打ち消して整合性を回復します。2相コミットのように全参加者のロックを保持し続けないため、長時間にわたる業務処理に向いています。この設問は「適切でない(=誤っている)説明」を選ぶ形式です。

選択肢ごとの解説

  • A記述は正しく、補償トランザクションの説明として適切です。設問が問う「適切でない説明」ではありません。
  • B記述は正しく、補償は再試行で複数回届きうるため冪等に作るのが原則です。適切な説明なので答えではありません。
  • C正しい。これが設問の答え(適切でない説明)です。各ローカルトランザクションは即座にコミットされ、その結果はSaga全体の完了を待たずに他から見えます。Saga全体は分離性(I)を持たないため、「完了まで結果が見えないので分離性を考慮しなくてよい」という記述は誤りです。
  • D記述は正しく、実行状況を永続化して再開や補償の続行を可能にするのは適切です。答えではありません。
LinuCレベル4 システムアーキテクトの問題を演習モードで解く