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

推薦する

Pacificrack: システムを再インストールできず、SSHログインができないバグを解決

Pacificrack はシステムを再インストールできません。どこで Pacificrack のシス...

百度は不注意、不公平、非専門的行為によって自らを破滅させている

2012年は、Baidu Statistics、Baidu Thumb、Baidu Browser、...

クラウドからクラウドインテリジェンスまで、Alibaba Cloud は何をリリースしましたか?

[51CTO.com からのオリジナル記事] 10 年前、ジャック・マー氏は「クラウドなしに未来はな...

ウェブサイトのランキングが一夜にして下がった理由の実践的な分析

今日は、弊社のSEO最適化研修に参加した学生のSEO事例分析を見てみましょう。彼のウェブサイトの状況...

#ブラックフライデー#: templatemonster-すべてのテンプレートが年に1回だけ40%オフ

インターネット上には2つの人気のテンプレート販売業者があります。1つはここで紹介するtemplate...

SEOオリジナル記事とソフト記事の違いは何ですか?

私たちはオリジナル記事の代筆業を営んでいますが、クライアントからよく「なぜ私たちのために書いてくれる...

SEO はなぜますます混乱を招くのでしょうか?

私は鄭州でほぼ 1 年間働いており、4 ~ 5 か月間 Web サイトの最適化に取り組んできました。...

OVH-$69/D-1520/32gメモリ(DDR4)/2X2Tハードディスク/250m無制限

皆様にお知らせしたいのですが、ovh はサーバーの新バージョンをリリースしました。以前の CPU は...

SEOの最適化とビデオポートのプロモーションが今後の焦点となる

ユニバーサル プレーヤー Qvod の後に、Baidu Video が登場しました。これら 2 つの...

私のように新しいウェブサイトを構築しようとしている新しいウェブサイト所有者向けに書かれています

私のデビュー記事が A5 ウェブマスター プラットフォームに掲載されたときはうれしかったです。今日は...

いくつかのビットコイン取引プラットフォームが共同で自主規律声明を発表

テンセントテクノロジーニュース(ファン・シャオドン)5月6日のニュースによると、国内のビットコイン取...

391 ラーニング ネットワーク: 農家がドメイン名に投資する際に理解する必要がある業界のルール

皆さんこんにちは。前回、「稲作農家として6年間の経験:良いドメイン名の選び方」という記事を書きました...

ZStack のクラウド コンピューティングへの道のり: 最先端技術の絶え間ない出現と絶え間ない製品化

[51CTO.com オリジナル記事] 2015 年に設立された ZStack は、3 年間の開発期...

精密プロモーションにおいて誰もが無視する重要なポイントの1つは、自分のウェブサイトのコンテンツを組み合わせることです。

オンライン マーケティングが Web サイトのキーワード ランキングに与える影響はますます大きくなり...