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つのこと

推薦する

SaaS データ保護の責任をどのように確立するのでしょうか?

データ保護とデータ規制への準拠には、組織内での明確な所有権と責任が必要です。最終的な責任は最高情報責...

ウェブサイトのユーザーエクスペリエンスデザイン分析: 色の声に耳を傾ける

序文色は、ウェブサイトが感情を表現したり、その個性を反映する方法であり、それぞれの色には独自の声があ...

実践的な共有: 企業ウェブサイトを運営するために必要な 7 つのステップとは

インターネットが私たちの生活に深く浸透するにつれて、インターネットが変えることができる領域はますます...

破壊がなければ、建設はない。ファーウェイクラウドはEDGの勝利に貢献する

2021年11月6日夜、アイスランドの首都レイキャビクでスリリングな逆転劇が繰り広げられた。中国のE...

エンタープライズクラウドコンピューティング導入の10の実践経験

IT 業界の業界団体 CompTIA によれば、現在、企業の 80% が、オンデマンドで起動できる仮...

海外調達:綱渡りビジネスの巨大産業チェーンには法的リスクが潜む

わが国では、海外購買は非常に成熟した産業チェーンを形成しています。国内の大手電子商取引プラットフォー...

業界サイトナビゲーションサイトの運営について

URL ナビゲーションといえば、中国の URL ナビゲーション Web サイトの創始者である hao...

スピード: Linode - 8か月間50ドル/クレジットカード無料

Linode が再び 50 ドルをプレゼントします。アカウント残高を 55 ドルにするには、クレジッ...

budgetvm: 日本専用サーバー、1Gbpsの帯域幅、無制限のトラフィック、月額88ドルから、米国に4つのデータセンターあり

budgetvm は 2005 年に設立されたアメリカの老舗企業です。主に米国 (ロサンゼルス、シカ...

成功するためのウェブサイトの始め方

無意識のうちに、Leixue のブログの更新が遅れてしまいました。Leixue のブログをフォローし...

重量移動とリンクレイアウト

昨日の記事「ブログの外部リンクについて言わなければならないこと」では、個人ブログに適した優れたウェブ...

民間病院のマーケティングにおける永遠のテーマ:付加価値サービス

今日、インターネットは急速に発展しており、多くの業界が新たな発展を模索しており、この発展が長期間継続...

エンタープライズハイブリッドクラウドの将来はどうなるのでしょうか?

現在でも、多くの組織は、ワークロード全体をオフプレミスからクラウドに移行することに苦労しています。こ...

Baiduの検索結果は画像とテキストの組み合わせに重点を置く

今日、Lu Songsong さんのブログで、自分のサイトのインクルード数が記録を更新したと書いてあ...

arkecx エンタープライズ クラウド: 国慶節期間中 25% 割引、1Gbps CN2 GIA 専用回線、1Gbps 帯域幅、ロサンゼルス、東京、香港

zenlayer傘下のエンタープライズレベルのクラウドサーバーブランドであるarkecxは、国慶節に...