この記事はWeChat公式アカウント「Mayuan Technology Column」から転載したもので、著者はChenです。この記事を転載する場合は、CodeApeテクノロジーコラム公式アカウントまでご連絡ください。 本日の記事では、Seata が TCC トランザクション モードを実装する方法を紹介します。記事ディレクトリは以下の通りです。 TCC モードとは何ですか?TCC (Try Confirm Cancel) ソリューションは、アプリケーション レベルの侵入サービスの 2 段階の送信です。これは現在最も人気のある柔軟な取引ソリューションです。その中心的な考え方は、各操作に対して、対応する確認および補償(キャンセル)操作を登録する必要があるということです。 TCC は次の 2 つのフェーズに分かれています。
確認: 実際の業務を実行します(業務を実行し、ロックを解除します) キャンセル: 予約したリソースをキャンセルします (問題がある場合はロックを解除します) TCC 理解を容易にするために、次のソリューションでは、電子商取引の注文を例にして分析します。ここでは、プロセス全体が在庫の減算と注文の作成という 2 つのステップに分割されます。在庫サービスと注文サービスは異なるサーバー ノード上にあります。 商品在庫が100個、購入数量が2個であるとします。ここで、在庫の確認と更新を行っている最中に、ユーザーの購入数量の在庫が凍結され、同時に注文が作成され、注文ステータスが確認待ちとなります。 ①トライステージTCC メカニズムの Try は、単なる予備操作です。これとその後の確認を組み合わせることで、完全なビジネス ロジックを形成できます。このステージでは主に次の作業が完了します。
トライステージ ②確認・キャンセル段階Try フェーズのすべてのサービスが正常に実行されたかどうかに応じて、確認操作 (Confirm) またはキャンセル操作 (Cancel) の実行を続行します。 確認操作とキャンセル操作は冪等性を満たします。確認またはキャンセル操作が失敗した場合は、実行が完了するまで再試行されます。 確認: 試行フェーズのすべてのサービスが正常に実行されると、確認ビジネス ロジック操作が実行されます。事業内容は次の図の通りです。 試す->確認 ここで使用するリソースは、Try フェーズで予約されたビジネス リソースである必要があります。 TCC トランザクション メカニズムでは、Try フェーズでリソースを正常に予約できれば、Confirm を完全に正しく送信できると考えられます。 確認段階は、試行段階の補足として見ることもできます。 Try+Confirm を組み合わせることで、完全なビジネス ロジックが形成されます。 キャンセル: 試行フェーズでサービスの実行に失敗した場合、キャンセル フェーズが開始されます。事業内容は以下のとおりです。 試す-キャンセル 「キャンセル」は実行をキャンセルし、Try ステージで予約されたビジネス リソースを解放します。上記の例では、キャンセル操作により凍結された在庫が解放され、注文ステータスがキャンセルに更新されます。 上記が TCC モードの全体的な概念です。この部分は、Chen の以前の記事でも詳しく紹介されています: 7 つの分散トランザクション ソリューションを比較すると、私は依然として Alibaba のオープン ソース Seata を好みます。これは本当に優れています。 (原理+実践) TCC モードの 3 つのタイプは何ですか?TCC モデルは業界で実際の生産に展開されており、次の 3 つのタイプがまとめられています。実は、公式の定義にはそのような記述はなく、企業の生産現場における実際のニーズから導き出された 3 つのソリューションです。 1. ユニバーサルTCCソリューション一般的な TCC ソリューションは、TCC トランザクション モデルの最も古典的な実装です。最初のセクションで説明したように、すべてのスレーブビジネスはマスタービジネスの意思決定に参加します。 ユニバーサル TCC 適用可能なシナリオ: スレーブ ビジネス サービスは同期的に呼び出されるため、その結果はマスター ビジネス サービスの決定に影響します。したがって、一般的な TCC 分散トランザクション ソリューションは、電子商取引システムの 3 つのコア サービスである注文サービス、アカウント サービス、在庫サービスなど、実行時間が一定かつ短いビジネスに適しています。 これら 3 つのサービスは、同時に成功するか、同時に失敗します。 在庫サービスとアカウント サービスを呼び出す第 2 フェーズが完了すると、分散トランザクション全体が完了します。 2. 非同期保証TCCソリューション非同期保証 TCC ソリューションの直接スレーブ ビジネス サービスは信頼性の高いメッセージ サービスですが、実際のスレーブ ビジネス サービスはメッセージ サービスを通じて分離され、メッセージ サービスのコンシューマーとして非同期に実行されます。 非同期保証 信頼性の高いメッセージ サービスでは、Try、Confirm、Cancel の 3 つのインターフェイスを提供する必要があります。 Try インターフェースは事前送信に使用され、メッセージ データを永続的に保存する役割のみを果たします。 Confirm インターフェースが送信を確認し、その後に実際のメッセージ配信が開始されます。キャンセル インターフェイスは送信をキャンセルし、メッセージ データを削除します。 メッセージ サービスのメッセージ データは独立して保存および拡張されるため、ビジネス サービスとメッセージ システム間の結合が軽減されます。信頼性の高いメッセージ サービスの前提の下で、分散トランザクションの最終的な一貫性が実現されます。 このソリューションではメッセージ サービスの保守コストが増加しますが、メッセージ サービスがビジネス サービスの代わりに TCC インターフェイスを実装するため、ビジネス サービスを変更する必要がなく、アクセス コストは非常に低くなります。 適用可能なシナリオ: ビジネス サービスからのメッセージの消費は非同期プロセスであるため、実行時間は不確実であり、一貫性のない時間ウィンドウが増加する可能性があります。したがって、非同期的に保証される TCC 分散トランザクション ソリューションは、最終的な一貫性の時間に対する敏感性がそれほど高くない一部のパッシブ ビジネスにのみ適しています (スレーブ ビジネス サービスの処理結果はメイン ビジネス サービスの決定に影響を与えず、メイン ビジネス サービスの決定結果を受動的に受信するだけです)。例えば、会員登録サービスやメール送信サービスなど。 3. 補償TCCソリューション補償型 TCC ソリューションの構造は一般的な TCC ソリューションの構造と似ており、そのスレーブ ビジネス サービスもメイン ビジネス サービスのアクティビティの意思決定に参加する必要があります。ただし、前者はビジネス サービスから Do と Compensate の 2 つのインターフェイスのみを提供する必要があるのに対し、後者は 3 つのインターフェイスを提供する必要があるという違いがあります。 Do インターフェースは実際の完全なビジネス ロジックを直接実行し、ビジネス処理を完了し、ビジネス実行結果を外部から表示できます。補償操作は、ビジネス補償、つまり、プラスのビジネス操作のビジネス結果を相殺または部分的に相殺するために使用されます。補償操作はべき等性を満たす必要があります。 一般的なソリューションと比較して、補償ソリューションでは、ビジネス サービスから元のビジネス ロジックを変更する必要がありません。追加の補償ロールバックロジックを追加するだけで済み、ビジネス変革の量は比較的少なくなります。ただし、ビジネスではビジネス ロジック全体が 1 つのステージで実行され、効果的なトランザクション分離を実現できないことに注意してください。ロールバックが必要な場合、補正が失敗する可能性があり、手動介入などの追加の例外処理メカニズムが必要になります。 適用可能なシナリオ: ロールバック補償が失敗する可能性があるため、補償 TCC 分散トランザクション ソリューションは、同時競合が少ない、または外部とのやり取りが必要な一部のビジネスにのみ適用できます。これら外部業務は受動的な業務ではなく、その実行結果が主業務サービスの意思決定に影響を与えます。 上記の内容は、https://seata.io/zh-cn/blog/tcc-mode-applicable-scenario-analysis.html?utm_source=gold_browser_extension から参照されています。 TCCトランザクションモードの実装前回の記事では、シータのATモードについて紹介しました。よくわからない場合は、次の記事をお読みください: 7 つの分散トランザクション ソリューションを比較すると、私は依然として Alibaba のオープン ソース Seata を好みます。これは本当に優れています。 (原理+実践) もちろん、Seata がサポートするトランザクション モードは AT モードに限定されず、TCC モード、SAGA モード、XA モードも含まれます。以下は TCC モードを統合したものです。 1. デモの様子電子商取引システムで注文を行う場合を例に挙げてみましょう。デモンストレーションのために、アカウント サービスを直接削除し、注文サービスと在庫サービスを例として使用します。 具体的なロジックは次のとおりです。
上記のロジックによれば、注文サービスは間違いなくメインのビジネス サービスであり、トランザクションの開始者であり、在庫サービスはスレーブ ビジネス サービスであり、トランザクションの意思決定に参加します。 Seata の AT モード ソリューションの疑似コードは次のとおりです。
@GlobalTransactional アノテーションは、グローバル トランザクションを開始するために使用されます。 ただし、AT モードには次のような制限があります。
したがって、パフォーマンスが求められる注文配置インターフェースの場合、TCC モードを使用して実行を 2 つのステージに分割することを検討できます。これにより、プロセス全体がリソースをロックする時間が短縮され、パフォーマンスが向上します。 TCC モードは次のように分割されます。 1) 1段階トライ操作 TCC モデルの Try ステージは、実際にはリソースを予約するためのものです。このプロセス中、必要な数量の商品の在庫が凍結される可能性があるため、在庫テーブルで凍結在庫フィールドを維持する必要があります。 疑似コードは次のとおりです。
注: @Transactional はローカル トランザクションを開きます。例外が発生する限り、ローカル トランザクションはロールバックされ、第 2 フェーズのキャンセル操作が実行されます。 2) 第2段階確認操作 確認操作は、最初のフェーズの試行操作が成功した後にトランザクションをコミットします。関連する操作は次のとおりです。
疑似コードは次のとおりです。
注: ここで false が返された場合は、TCC 仕様に従って、確認が完了するまで再試行を続けます。 3) 第2段階キャンセル操作 最初の段階の try 操作で例外が発生した後、cancel 操作が実行されます。リソースをロールバックするために使用されます。関連する操作は次のとおりです。
疑似コードは次のとおりです。
注: ここで false が返された場合、TCC 仕様に従って、キャンセルが完了するまで再試行を継続する必要があります。 2. TCC取引モデルの3つの異常TCC トランザクション モデルの実装に伴う 3 つの例外は避けられず、実際の運用では回避する必要があります。 1) 空のロールバック 定義: try メソッドが呼び出されなかったり、try メソッドが正常に実行されなかった場合は、cancel メソッドが実行されてロールバックされます。 それをどう理解すればいいのでしょうか? try メソッドを呼び出さずに cancel メソッドが実行されます。これは理解しやすいですね。リソースが予約されていないため、ロールバックは絶対に不可能です。 try メソッドが正常に実行されなかったとはどういう意味ですか? 最初の段階の try メソッドの疑似コードは前のセクションで確認できます。 try メソッドはローカル トランザクションを開始するため、try メソッドの実行中に例外が発生すると、try メソッドのローカル トランザクションがロールバックされます (ロールバックされるのは cancel メソッドではなく、try メソッドのローカル トランザクションであることに注意してください)。この方法では、try メソッド内のすべての操作がロールバックされ、cancel メソッドを呼び出す必要がなくなります。 しかし実際には、try メソッドが例外をスローすると、ロールバックするために cancel メソッドを呼び出す必要があり、その結果、空のロールバックが発生します。 解決: 解決ロジックは非常にシンプルです。cancel メソッドが操作を実行する前に、try メソッドが正常に実行されたかどうかを知る必要があります。 2) 冪等性 TCC モード定義には、確認またはキャンセル メソッドが失敗した場合は、成功するまで再試行を続けると記載されています。 これにはべき等性が関係します。確認メソッドとキャンセル メソッドは、同じグローバル トランザクション内での冪等性を保証する必要があります。 解決: 解決ロジックは非常に単純です。べき等性に対処するには、べき等性フラグを使用して繰り返し操作を防ぐのが自然です。 3) サスペンション トランザクション コーディネータが TCC サービスの第 1 段階の Try 操作を呼び出すと、ネットワークの輻輳によりタイムアウトが発生する可能性があります。このとき、トランザクション マネージャーは第 2 段階のロールバックをトリガーし、TCC サービスのキャンセル操作を呼び出します。キャンセル呼び出しはタイムアウトしません。 その後、ネットワーク上で輻輳した第 1 段階の Try データ パケットが TCC サービスによって受信され、第 1 段階の Try 要求の前に第 2 段階の Cancel 要求が実行されます。遅い Try を実行した後、この TCC サービスは第 2 段階の Confirm または Cancel を受信できず、TCC サービスがハングします。 解決: 解決ロジックは非常にシンプルです。リソースを操作する try メソッドを実行する前に、cancel メソッドが実行されたかどうかを判断します。同様に、キャンセル メソッドを実行した後は、実行ステータスを記録する必要があります。 4) まとめ 上記の 3 つの例外に対しては、各トランザクションのすべての実行段階を記録するトランザクション ステータス テーブルを維持するなど、実用的な解決策が多数あります。
シータはTCCを統合して達成プロジェクトを構築して依存関係を追加する方法については詳しく説明しません。まだよく知らない方は、私の以前の記事「7 つの分散トランザクション ソリューションを比較した結果、私はやはり Alibaba のオープン ソース Seata を好みます。これは本当に優れています!」をお読みください。 (原理+実践) このセクションではキーコードのみを紹介します。結局、長さには限りがあります。その他の部分のソースコードをダウンロードしてください。 ソースコードディレクトリは次のとおりです。 ソースコードディレクトリ プロジェクトを開始するために必要な関連文書は次のとおりです。 nacos ディレクトリ内の SEATA_GROUP は、Seata トランザクション サーバーおよびクライアントに必要な関連構成であり、nacos に直接インポートできます。 seataディレクトリのconfは1.3.0バージョンサーバーの設定です SQL カタログは複数のデータベースに関連しています。 1. TCCインターフェース定義order-boot モジュールで OrderTccService を作成します。コードは次のとおりです。 コード内のコメントはすでに非常に充実していますが、ここではいくつかの重要なポイントを紹介します。
2. TCCインターフェースの実装定義ができたので、次のように実装する必要があります。 1) tryメソッド メソッドを試す ①のコードは例外のハングを防ぐためのものです。トランザクション ログ テーブルからグローバル トランザクション ID のステータスを取得します。キャンセル状態の場合は実行されません。 ②のコードは在庫を凍結する ③のコードで注文が生成され、ステータスは確認待ちになります ④のコードは、キーが現在のクラスとグローバルトランザクションID、値が現在のタイムスタンプであるタグをべき等ツールクラスに追加します。 注: ローカル トランザクションを有効にする必要があります。上記のコードでは、@Transactional を使用してローカル トランザクションを有効にします。 2) 確認方法 確認方法 ①のコードは、現在のクラスとグローバルトランザクションIDに従って、べき等ツールクラスから値を取得します。 try フェーズが正常に実行された場合は値が追加され、confirm メソッドが正常に実行された場合は値が削除されるため、confirm の開始時に値が存在するかどうかを判断することで、べき等効果が実現され、再試行を防ぐことができます。 ⑥のコードは、tryメソッドで追加された値をべき等ユーティリティクラスの外に移動します。 ②のコードは、BusinessActionContextからtryメソッドの入力パラメータを取得します。 ③のコードは凍結された在庫を解放するためのものです ④のコードは注文のステータスを完了に変更します。 注意: 1. ローカル トランザクションを有効にします。2. 戻り値に注意してください。 false が返された場合、プロセスは再試行されます。 3) キャンセル方法 キャンセル方法 ①のコードは、トランザクション ログ テーブルにデータを挿入し、現在のトランザクションがキャンセル メソッドに入っていることをマークして、ハングアップを防止します。これはtryメソッドの①のコードに相当します。 ②のコードは、べき等性ツールクラス内の対応する現在のクラスとグローバルトランザクションIDでtryメソッドが正常に実行された場合にのみ値が格納されるため、べき等性と空のロールバックを防ぐためのものです。これにより、冪等性と空のロールバックの両方が防止されます。 ③のコードは凍結された在庫を復元します。 ④のコードはこの注文を削除します ⑤のコードは、べき等ツールクラスの現在のクラスとグローバルトランザクションIDに対応する値を削除します。 3. TCC モデルの 3 つの異常をどのように防ぐか?実装方法は多数あります。場合によっては、現在のステータスがトランザクション ログ テーブルに完全に記録され、べき等性、空のロールバック、中断の問題が完全に解決されます。 便宜上、Chen は次の 2 つのソリューションを使用しました。 1) 冪等性と空のロールバック 冪等ツール クラスが使用されます。このクラスには、キーが現在のクラスとグローバル トランザクション ID で、値がタイムスタンプであるマップが含まれています。 コードは次のとおりです。 考え方は次のとおりです。
2. サスペンション サスペンションの実装はトランザクション ログ テーブルに依存しており、テーブル構造は次のとおりです。
xid はグローバル トランザクション ID であり、status はトランザクションのステータスです。 他のフィールドも拡張可能 ハング問題を解決するためのロジックは次のとおりです。
4. 注文を作成するためのビジネスメソッド上記は、TCC の 3 つの方法を完了しただけです。主要なビジネス トランザクションの開始者はまだ提供されていません。コードは次のとおりです。 @GlobalTransactional アノテーションはグローバル トランザクションを開始し、トランザクションのイニシエーターとなります。 TCC の try メソッドは内部で直接呼び出されます。 5. その他の構成上記は主要な手順のみを記載したものです。残りの構成は、ケースのソース コードに従って次のように完了します。
注: 必ず Seata のトランザクション グループ tx-service-group を設定してください。設定方法については前回の記事をご覧ください。 6. まとめTCC トランザクション モデルは比較的単純です。ご興味がございましたら、ソースコードをダウンロードしてお試しください。 |
<<: 分散システムにおける信頼性とフォールトトレランスのエンジニアリング
>>: クラウド コンピューティングがビジネスを成功に導く 4 つの方法
クラウドの登場と大規模な導入以来、企業はさまざまなデジタル変革の段階にあります。すべてのデータをクラ...
これは昨日、Qiyi Network カスタマー サービスで顧客から寄せられた質問です。彼はオンライ...
Salesforce や Amazon などの新興クラウド コンピューティング ベンダーの成果が話題...
月収10万元の起業の夢を実現するミニプログラム起業支援プランウェブサイトのインデックス数が急激に減少...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますBaidu...
クラウドコスト管理会社 Yotascale の創設者兼 CEO である Asim Razzaq 氏は...
優れた Web サイトには、魅力的なテキスト コンテンツに加えて、画像の表示も必要です。いわゆる画像...
オンラインプロモーションには様々なチャネルがあります。今回は主流のオンラインプロモーションチャネル1...
「オンライン マーケティング」という言葉は誰もが知っていると思います。簡単に言えば、オンライン マー...
エッジ コンピューティングは、コンピューター ビジョンをインテリジェント システム、スマート デバイ...
Admin5 Webmaster Networkは2月29日、昨日、百度開放型ブランドゾーンがプロモ...
技術革新の中心都市である広東省深センには、革新的な産業が集中しているエリアが数多くあります。これらの...
総合エンターテインメントアプリケーショングローバル購買ベーン今年第3四半期、当社は海外の主要市場にお...
Podman[1] (POD MANager)は、コンテナ、イメージ、ボリューム、およびPodをコン...
flokinet.is は 2006 年に設立されたアイスランドのホスティング会社で、主にオフショア...