1.3.3 Try-Confirm/Cancelトランザクション・プロトコル
Try-Confirm/Cancel (TCC)トランザクション・プロトコルは、トランザクションが確定されるか取り消されるまで、リソースを予約状態のまま保持します。トランザクションが取り消されると、予約されたリソースが解放され、インベントリで使用できるようになります。
TCCトランザクション・プロトコルは、基本のHTTP
動詞(POST
、PUT
およびDELETE
)に依存します。アプリケーションが次のガイドラインに準拠していることを確認します:
- トランザクション・イニシエータ・サービスは、
POST
HTTPメソッドを使用して新しい予約を作成する必要があります。このリクエストへのレスポンスとして、トランザクション参加側サービスは予約を表すURIを返す必要があります。MicroTxクライアント・ライブラリは、MicroTx固有のヘッダーにそのURIを配置して、URIがコール・スタックに伝播されるようにします。 - このプロトコルは参加側サービスに依存して、確実にすべての参加側サービスが予約を確定するか取り消すようにします。URIは、予約を確定するために
PUT
HTTPメソッドに応答し、予約を取り消すにはDELETE
HTTPメソッドに応答する必要があります。
次の図は、TCCトランザクションでマイクロサービスとMicroTxが相互に作用する仕組みを示しています。

マイクロサービスAはトランザクション・イニシエータ・サービスです。トランザクションを開始して終了させます。トランザクションに参加側サービスを含める必要があることを示すリクエストを参加側サービスに送信します。
マイクロサービスBおよびCは参加側サービスです。これらのサービスは、既存のトランザクションに参加するだけです。トランザクションを開始することはありません。試行フェーズ
TCCプロトコルでは、トランザクション・イニシエータ・サービスが、他の参加側マイクロサービスにリソースを予約するように求めます。試行フェーズで、MicroTxライブラリは、受け入れたすべての予約を収集します。これには、参加側サービスによって行われた予約が含まれます。イニシエータ(上にある例の図のマイクロサービスA)がマイクロサービスBとマイクロサービスCに対して予約を完了するまで、MicroTxライブラリがすべての予約を収集します。その時点で、イニシエータは、予約の確定、取消または無視を決定できます(無視した場合、タイムアウトによって最終的に予約が取り消されます)。
確定/取消フェーズ
イニシエータ・サービスに指定されているビジネス・ロジックに基づいて、すべての予約を確定するか、すべての予約を取り消すかを決定できます。イニシエータとすべての参加側が必要な予約を取得すると、イニシエータ・サービスは、すべての予約を確定するようにMicroTxにリクエストを送信します。イニシエータ・サービスがビジネス・ロジックに基づいて、行われた予約が必要ない(使用できない)と判断すると、すべての予約を取り消すようにMicroTxにリクエストします。予約の内容はアプリケーションによって異なります。
公演の座席を予約して購入するためのシンプルなマイクロサービスについて考えてみましょう。座席の状態は、AVAILABLE
、RESERVED
、SOLD
のいずれかになります。試行フェーズでは、座席の状態がAVAILABLE
からRESERVED
に変更されます。確定フェーズでは、支払が正常に完了したことを前提として、状態がRESERVED
からSOLD
に変更されます。取消フェーズでは、状態がRESERVED
からAVAILABLE
に変更されます。支払が正常に完了しなかった場合の確定ステップのエラーを防ぐために、試行フェーズでは、マイクロサービスは支払が確実に行われるように支払承認を取得する必要があります。
アプリケーションが特定の数量(在庫の品目や口座の資金など)を予約する別の例について考えてみましょう。このケースでは、試行フェーズで、使用可能な数量から予約した数量を差し引き、予約のレコードがデータベースに追加されます。確定フェーズでは、予約レコードが削除されます。取消フェーズでは、予約レコードの数量が在庫数量に戻され、予約レコードが削除されます。
次のステップで、マイクロサービスとMicroTxを含むTCCトランザクションの正常なパスを示します。エラー時には、イニシエータ・サービスが確定のかわりに取消をコールします。
- トランザクション・イニシエータ・サービスであるマイクロサービスAが、MicroTxクライアント・ライブラリ・コールを行ってTCCトランザクションを開始します。
- トランザクション・イニシエータ・サービスは、参加側サービスであるマイクロサービスBで
POST
を呼び出して、リソースXを予約します。 - マイクロサービスBは、必要なリソースを予約し、その予約を表すURIをトランザクション・イニシエータであるマイクロサービスAに返します。
- トランザクション・イニシエータ・サービスは、参加側サービスであるマイクロサービスCで
POST
を呼び出して、リソースYを予約します。 - マイクロサービスCは、必要なリソースを予約し、その予約を表すURIをトランザクション・イニシエータであるマイクロサービスAに返します。
- マイクロサービスA (トランザクション・イニシエータ・サービス)が、MicroTxをコールして、予約を確定するか取り消します。
- MicroTxが、
PUT
をコールして確定するか、DELETE
をコールしてすべてのURI (予約)を取り消し、トランザクションを完了します。 - 参加側サービスはリソースを確定するか取り消してから、HTTPレスポンス・コード
200
をMicroTxに返します。 - MicroTxは、トランザクション・イニシエータであるマイクロサービスAに正常を示すステータスを返します。MicroTxが、1つ以上の参加側から200ステータスを受信しない場合は、エラー・メッセージを返します。
親トピック: 分散トランザクション・プロトコルについて