Nodeを使用して分散トランザクションを簡単に完了するTCC、乳母レベルのチュートリアル

Nodeを使用して分散トランザクションを簡単に完了するTCC、乳母レベルのチュートリアル

[[428021]]

TCCとは何ですか? TCC は Try、Confirm、Cancel の略です。これは、2007 年に発表された「分散トランザクションを超えた生活: 背教者の意見」と題された論文の中で、パット ヘランドによって初めて提案されました。

TCC構成

TCCは3つの段階に分かれています

  • 試行フェーズ: 実行を試行し、すべてのビジネス チェックを完了し (一貫性)、必要なビジネス リソースを予約します (準分離)

  • 確認フェーズ: すべてのブランチの試行が成功した場合は、確認フェーズに進みます。 Confirmは、ビジネスチェックなしで実際にビジネスを実行し、Tryステージで予約されたビジネスリソースのみを使用します。

  • キャンセル ステージ: すべてのブランチの Try 操作のいずれかが失敗した場合、プロセスはキャンセル ステージに進みます。キャンセルは、試行フェーズで予約されたビジネス リソースを解放します。

TCC 分散トランザクションには、従来の XA 分散トランザクションと同じように、次の 3 つの役割があります。

  • AP/アプリケーションは、グローバルトランザクションを開始し、どのトランザクションブランチがグローバルトランザクションに含まれるかを定義します。

  • 支店業務のさまざまなリソースの管理を担当するRM/リソースマネージャー

  • TM/トランザクション マネージャーは、確認とキャンセルの実行、ネットワーク例外の処理など、グローバル トランザクションの正しい実行の調整を担当します。

銀行間送金に似た業務を行う場合、送金 (TransOut) と入金 (TransIn) は異なるマイクロサービスに存在します。正常に完了した TCC トランザクションの一般的なシーケンス図は次のとおりです。

TCCネットワーク異常

グローバル トランザクション プロセス全体を通じて、TCC ではさまざまなネットワーク異常が発生する可能性があります。通常は、空のロールバック、べき等性、中断などです。 TCC の異常は SAGA や信頼性の高いメッセージングなどのトランザクション モードに似ているため、この記事「分散トランザクションの 7 つの古典的なソリューション」のサブトランザクション バリアのセクションで、異常に対するすべてのソリューションについて説明します。

TCC実践

次に、TCC取引の具体的な開発を行います。

現在 TCC で利用できるオープン ソース フレームワークは主に Java 言語であり、seata が最も代表的です。この例では nodejs を使用し、使用される分散トランザクション フレームワークは dtm です。これは分散トランザクションを非常にエレガントにサポートします。 TCCの構成について詳しく説明します。

次に、具体的なTry/Confirm/Cancel処理関数を書いてみましょう。

  1. router.post( '/api/TransOutTry' , (ctx, next) => {
  2. console.log( "TransOutTry" )
  3. ctx.body = { 結果: "成功" }
  4. }).post( '/api/TransOutConfirm' , (ctx, next) => {
  5. console.log( "TransOutConfirm" )
  6. ctx.body = { 結果: "成功" }
  7. }).post( '/api/TransOutCancel' , (ctx, next) => {
  8. console.log( "TransOutCancel" )
  9. ctx.body = { 結果: "成功" }
  10. }).post( '/api/TransInTry' , (ctx, next) => {
  11. console.log( "TransInTry" )
  12. ctx.body = { 結果: "成功" }
  13. }).post( '/api/TransInConfirm' , (ctx, next) => {
  14. console.log( "TransInConfirm" )
  15. ctx.body = { 結果: "成功" }
  16. }).post( '/api/TransInCancel' , (ctx, next) => {
  17. console.log( "TransInCancel" )
  18. ctx.body = { 結果: "成功" }
  19. })

この時点で、各サブトランザクションの処理機能は正常であり、TCCトランザクションが開かれて分岐呼び出しが行われます。

  1. 非同期関数 FireTcc() {
  2. let dtm = "http://localhost:8080/api/dtmsvr" // dtm サービス アドレス
  3. let svc = "http://localhost:4005/api" // ローカルサービスプレフィックス
  4. // tcc トランザクションを開きます。 2番目のパラメータにグローバルトランザクションのロジックを記述します 
  5. dtmcli.tccGlobalTransaction(dtm, async (t) => {を待機します。
  6. let req = { amount: 30 } // サブトランザクションに必要なペイロードの量 
  7. console.log( "trans out を呼び出しています" )
  8. // トランザクションブランチを登録し、ブランチ内のTryメソッドを呼び出します 
  9. t.callBranch(req、svc + "/TransOutTry" 、svc + "/TransOutConfirm" 、svc + "/TransOutCancel" )を待機します。
  10. console.log( "trans in を呼び出しています" )
  11. // トランザクションブランチを登録し、ブランチ内のTryメソッドを呼び出します 
  12. t.callBranch(req、svc + "/TransInTry" 、svc + "/TransInConfirm" 、svc + "/TransInCancel" )を待機します。
  13. })
  14. }

この時点で、完全な TCC 分散トランザクションが書き込まれました。

完全な成功例を実行したい場合は、この例yedf/dtmcli-node-sampleを参照してください。実行は非常に簡単です。

  1. # dtmを展開して起動する
  2. # docker バージョン18以上が必要です
  3. gitクローンhttps://github.com/yedf/dtm  
  4. CDDTM
  5. docker-compose を起動する
  6.  
  7. # 別のコマンドラインを開始する
  8. gitクローンhttps://github.com/yedf/dtmcli-node-sample  
  9. cd dtmcli-node-sample
  10. npmインストール
  11. ノード。

TCC ロールバック

銀行がユーザー2に金額を振り込む準備をしているときに、ユーザー2の口座に異常を発見し、失敗を返した場合はどうなりますか?トランザクション失敗の相互作用のタイミング図を示します。

これと成功した TCC の違いは、サブトランザクションが失敗を返すと、その後グローバル トランザクションがロールバックされ、各サブトランザクションのキャンセル操作が呼び出されて、グローバル トランザクションが完全にロールバックされるようになることです。

まとめ

この記事では、TCC の理論的知識を紹介し、通常の正常な完了と正常なロールバックを含む、TCC トランザクションの記述プロセスの完全な例を示しました。この記事を通じて読者の皆様にはTCCについて深く理解して頂けたのではないかと思います。

分散トランザクションに関するより包括的な知識については、「分散トランザクションの最も古典的な 7 つのソリューション」を参照してください。

この記事で使用されている例は、yedf/dtm から抜粋したものです。複数のトランザクション モード (TCC、SAGA、XA) と、トランザクション メッセージのクロス言語サポートをサポートします。 golang、python、Java、PHP、nodejs などの言語のクライアントをサポートしています。各言語のSDKをご参照ください。サブトランザクション バリア機能を提供して、べき等性、中断、空の補償などの問題をエレガントに解決します。

この記事を読んだ後は、https://github.com/yedf/dtm プロジェクトにアクセスし、スターを付けてサポートしてください。

<<:  クラウドネイティブアプリケーションを保護する方法

>>:  顧客がクラウドコンピューティングベンダーに知りたい2つのこと

推薦する

クラウドコンピューティングの大きな問題は、リズムを正しく保つことだ

機会の観点から見ると、クラウド コンピューティングは中国の産業が世界の先進国と真に同等になる唯一のチ...

CSS3 背景画像の詳細な理解

月収10万元の起業の夢を実現するミニプログラム起業支援プラン背景画像を設定するには、backgrou...

WEB2.0 ウェブサイトで検索エンジンを最適化する方法

Douban など、多くの WEB2.0 ウェブサイトは検索エンジン最適化をうまく行っています。本を...

SEOの良い習慣ウェブサイトの良いランキング

これはトップレベルのSEO最適化テクニックに関する記事ではありません。SEOテクニックを学びたいだけ...

クラウドネイティブフルスタックモニタリングの詳細な説明

序文現在、世界中の企業のクラウド化とデジタル化のプロセスは加速し続けており、コンテナやマイクロサービ...

共同購入の再編は一流キャンプに影響、ウェブサイトでの苦情解決率はわずか40%

共同購入は今年2度目の規模縮小となる可能性一連の再編を経て、1月末現在、共同購入サイトの数は3,79...

百度Kステーション第2波:データベース更新の疑い

6月22日のBaiduのKステーションは皆さんも覚えていると思いますが、この時はサイトが大規模にKス...

QuickPacket 50% オフ、超安定

QuickPacket は正式に登録された会社であり、数年にわたって運営されているため、逃げられる心...

Red Hat Enterprise Linux 6.10 がリリースされ、ミッションクリティカルな安定性が向上

オープンソース ソリューションの世界的な大手プロバイダーである Red Hat, Inc. (NYS...

Pinterest のこれまでの発展の軌跡と今後のロードマップは何でしょうか?

(TechCrunchからのオリジナル記事、Sina Technologyによる翻訳) Pinter...

51la がダウンしています。あなたのウェブサイトは検索エンジンにどう対処すべきでしょうか?

Zitian がブロックされた場合、Web サイトに損失を与えない解決策があります。同時に、何人の ...

ソフトコンテンツマーケティングはウェブサイトの成功のための強力なツールです

ソフト記事マーケティングは、現在SEOにとって最も重要なツールとなっています。現在、多くの主流ウェブ...

スワンクラウド: 安価、実名登録不要、障壁なし、アリババクラウドの「国際製品ライン」に簡単にアクセス

国内の個人や法人のユーザーは、Alibaba Cloud の国際サービスに登録して使用することは一般...

バックリンク戦略の共有

外部リンクはまさに​​諸刃の剣です。外部リンクを上手に行う人は専門家であり、下手に行う人は不正行為者...