LinuCレベル4 システムアーキテクト システムアーキテクチャ 問2
システムアーキテクチャ/アーキテクチャの設計原則と主要パターン航空券と宿泊をまとめて予約するシステムで、航空側と宿泊側の各サービスが「仮押さえ」の状態を業務として扱える。両方の確保に成功したときだけ予約を確定し、どちらかが失敗したら仮押さえを解放したいため、TCC(Try-Confirm/Cancel)パターンを採用する。設計として適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「システムアーキテクチャ」に対応。実際の試験問題ではありません)
- A各サービスが仮押さえ・確定・取消の3操作をAPIとして提供し、確定と取消は再実行しても結果が同じになるよう冪等にする
- BTryの段階で各サービスのデータベースの行ロックを取得し、全参加者の確定が揃うまで保持してから一括でコミットする
- C各サービスは受け付けた時点で予約を確定させ、失敗が判明したら後から補償処理で予約を取り消す
- DConfirmは必ず成功する前提とし、確定処理の失敗や通信断に備えた再試行やタイムアウトは設けない
正解:A
解説
TCCは、Tryで各参加者の資源を業務レベルで仮押さえし、全員のTryが成功したらConfirmで確定、いずれかが失敗したらCancelで仮押さえを解放するパターンです。仮押さえは業務上の状態として表現するため、データベースのロックを長時間保持する必要がありません。ConfirmやCancelは通信断などで再送されうるので冪等に作り、Confirm/Cancelが届かない場合に備えて仮押さえにはタイムアウトによる自動解放を設けるのが一般的です。先に確定してから打ち消すSagaと違い、確定前の資源が「仮押さえ中」として他の利用者から区別できる点が特徴です。
選択肢ごとの解説
- A正しい。TCCでは参加者ごとにTry・Confirm・Cancelの3操作を用意し、再送に耐えるようConfirmとCancelを冪等にします。
- B誤り。データベースのロックを全体の確定まで保持するのは2相コミット(XA)に近い方式です。TCCは業務上の仮押さえで資源を確保し、ロックを長く持たないことが利点です。
- C誤り。先に確定させて失敗時に補償で取り消すのはSagaの考え方です。仮押さえの状態を扱えるこの要件ではTCCの利点が活かせません。
- D誤り。Confirmも通信断などで失敗しえます。再試行と冪等性、仮押さえのタイムアウトを設計しないと資源が確保されたまま残ります。