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

推薦する

企業サイトが推進すべき運用・プロモーション手法

企業のウェブサイトのコンテンツは、他のウェブサイトに比べてはるかに少ないことは誰もが知っています。多...

Google、新しいブックマークサービス「Google Stars」を発表

Google は本日、長らく噂されていたブックマーク サービス「Google Stars」の開始を発...

ウェブマスターネットワークからの毎日のレポート:ヤフーCEOが辞任、タオバオがタオバオの顧客の商品検索を禁止

1. ヤフー、トンプソンCEOの退任と取締役会構造の大幅変更を発表新浪科技は北京時間5月14日午前、...

ウェブサイトに「ロックを追加」動的パスワードを簡単に実現

インターネットの普及に伴い、ネットワークセキュリティの問題はますます深刻になっています。有名な技術交...

検索エンジンによるキーワードスタッフィングの認識

検索エンジンと検索エンジン最適化 (SEO) は、常に矛盾した関係にあります。適切な最適化は、検索エ...

cometvps-2.5USD/VPS/1GB RAM/100GB HDD/1TB Flow/シカゴ/ニューヨーク

Cometvps が初めて私の前に現れたのは、おそらく昨年のブラックフライデーだったと思います。Co...

ユーザーエクスペリエンス分析: Renrenタイムラインの戦略的意義

タイムラインは、時間を手がかりにしてフィードを表示するプレゼンテーション形式です。 2011年以降、...

中国電子クラウド、グローバルクラウドネイティブ機能を形成するための分散戦略を発表

2020年、CECはCEC Cloudブランドを正式に立ち上げ、CEC Cloudの正式な発売を開始...

SEO がどこに向かっているのか考えていました。

SEO がどこに向かっているのか考えていました。あなたは今も SEO を行っていますか? もしそうな...

CPU仮想化によりクラウドコンピューティングが普及

仮想化は、データセンターにおける新しいテクノロジーから主流のテクノロジーへと進化しました。以前は、デ...

実戦例:百度のスナップショットはウェブサイトのランキングとは無関係

インターネット上の多くの SEO「専門家」は、ウェブサイトの Baidu スナップショットはウェブサ...

Baidu のオリジナル Spark Project 検索エンジンが重複コンテンツを識別する方法

百度検索エンジンは、インターネットの情報内容を是正するために、「百度オリジナルスパーク計画」を大規模...