Goを使用してXA分散トランザクションを簡単に完了する、ナニーレベルのチュートリアル

Goを使用してXA分散トランザクションを簡単に完了する、ナニーレベルのチュートリアル

[[423848]]

取引

一部のビジネス要件では、一連の操作の一部ではなく、すべてを実行する必要があります。たとえば、転送操作は次のようになります。

  1. -- ID= 1のアカウントから ID= 2のアカウントに100元を送金する
  2. -- ステップ 1: ID = 1のアカウント A の残高から100 を減算します。
  3. アカウントを更新します。SET balance = balance - 100 WHERE id = 1 ;
  4. -- ステップ 2: ID = 2のアカウント B の残高に100 を追加します。
  5. アカウントを更新します。set balance = balance + 100 WHERE id = 2 ;

これら 2 つの SQL ステートメントは、すべて実行する必要があります。何らかの理由で最初のステートメントが成功し、2 番目のステートメントが失敗した場合は、すべてを元に戻す必要があります。

複数のステートメントをまとめて操作するこの機能は、データベース トランザクションと呼ばれます。データベース トランザクションにより、トランザクションのスコープ内のすべての操作が成功または失敗することを保証できます。トランザクションが失敗した場合、SQL ステートメントが実行されなかった場合と同じ結果となり、データベース データは変更されません。

マイクロサービス

トランザクションに関係するすべての操作をサービス内に配置できる場合、さまざまな言語のトランザクション関連ライブラリを使用して、複数の操作をトランザクション操作全体として簡単に実装できます。

しかし、注文の生成などの一部のサービスでは、在庫、クーポン、ギフト、口座残高など、多くの操作を実行する必要があります。システムの複雑さが増すと、これらすべての操作を 1 つのサービスに実装しようとすると、結合度が高くなりすぎて、メンテナンス コストが非常に高くなります。

複雑なシステムの場合、現在普及しているマイクロサービス アーキテクチャは非常に優れたソリューションです。このアーキテクチャでは、複雑なシステムを、独立して開発および保守される多数のマイクロサービスに分割できます。

サービスは分割されていますが、注文自体のロジックでは全体として複数の操作が必要であり、すべてが成功するかすべてが失敗するかのいずれかになるため、新たな課題が生じます。さまざまなマイクロサービスに分散しているローカル トランザクションを 1 つの大きなトランザクションに結合して、全体として動作するようにする方法は、分散トランザクションが解決する必要がある問題です。

分散トランザクション

簡単に言えば、分散トランザクションは、さまざまな小さな操作で構成された大規模な操作です。これらの小さな操作は異なるサーバーに分散され、異なるアプリケーションに属します。分散トランザクションでは、これらの小さな操作がすべて成功するか、すべて失敗するかを保証する必要があります。本質的に、分散トランザクションは、異なるデータベース間でのデータの一貫性を確保するように設計されています。

分散トランザクション ソリューションには以下が含まれます。

  • x
  • tcc
  • サガ
  • 信頼できるニュース

最も単純なものを見てみましょう

1000

XA は、X/Open 組織によって提案された分散トランザクション仕様です。 XA 仕様は主に、(グローバル) トランザクション マネージャー (TM) と (ローカル) リソース マネージャー (RM) 間のインターフェイスを定義します。 MySQLなどのローカルデータベースはXAのRMの役割を果たす

XA は 2 つの段階に分かれています。

最初のフェーズ (準備): 参加しているすべての RM がトランザクションの実行を準備し、必要なリソースをロックします。参加者の準備ができたら、TM に準備ができたことを報告します。フェーズ 2 (コミット/ロールバック): トランザクション マネージャー (TM) は、すべての参加者 (RM) の準備ができていることを確認すると、すべての参加者にコミット コマンドを送信します。

現在、MySQL、Oracle、SQL Server、PostgreSQL など、ほとんどの主流データベースは XA トランザクションをサポートしています。

ローカル データベースが XA をどのようにサポートしているかを見てみましょう。

ステージ 1 準備

  1. XA 開始'4fPqCNTYeSG'
  2. `user_account` を更新し、`balance`=balance + 30 、`update_time`= '2021-06-09 11:50:42.438'を設定します。ここで、user_id = '1'です。
  3. XA 終了'4fPqCNTYeSG'
  4. XA は'4fPqCNTYeSG'を準備します
  5. -- 参加者全員が準備を完了すると、提出の第2段階に入ります。
  6. xa コミット'4fPqCNTYeSG'

練習する

ここまで紹介したので、分散トランザクションの理解を深めるために、マイクロサービスで XA トランザクションを完了する練習をしてみましょう。ここでは、分散トランザクションのマネージャーとして DTM を使用して、XA デモの 1 つを実行します。

goをインストールする mysqlをインストールする

dtmを入手

  1. gitクローンhttps://github.com/yedf/dtm.git
  2. CDDTM

MySQLの設定

  1. conf.sample.yml conf.yml をコピーします。
  2. vi conf.yml

例を実行する

go run app/main.go xa

ログから XA 部分の出力を見つけることができ、最終的にトランザクションを正常に送信できます。

  1. # サービス1出力
  2. XA 開始'4fPqCNTYeSG'
  3. `user_account` を更新し、`balance`=balance - 30 、`update_time`= '2021-06-09 11:50:42.438'を設定します。ここで、user_id = '1'です。
  4. XA 終了'4fPqCNTYeSG'
  5. XA は'4fPqCNTYeSG'を準備します
  6. # サービス2の出力
  7. XA 開始'4fPqCPijxyC'
  8. `user_account` を更新し、`balance`=balance + 30 、`update_time`= '2021-06-09 11:50:42.493'を設定します。ここで、user_id = '2'です。
  9. XA 終了'4fPqCPijxyC'
  10. XA は'4fPqCPijxyC'を準備します
  11. # サービス1出力
  12. xa コミット'4fPqCNTYeSG'
  13. #サービス2出力
  14. xa コミット'4fPqCPijxyC'

全体のやり取りのタイミングの詳細は次のとおりです。

コードは次のとおりです。

  1. // マイクロサービス処理関数:
  2. app.POST(BusiAPI+ "/TransInXa"、common.WrapHandler(func(c *gin.Context) (インターフェース{}、エラー){
  3. XaClient.XaLocalTransaction(c.Request.URL.Query(), func(db *sql.DB, xa *dtmcli.Xa) (インターフェース{}, error)を返します{
  4. _, err := dtmcli.DBExec(db, "dtm_busi.user_account を更新し、残高をbalance+? に設定し、user_id=?" 、reqFrom(c).Amount、 2 )
  5. dtmcli.MapSuccess、エラーを返します
  6. })
  7. }))
  8. app.POST(BusiAPI+ "/TransOutXa"、common.WrapHandler(func(c *gin.Context) (インターフェース{}、エラー){
  9. XaClient.XaLocalTransaction(c.Request.URL.Query(), func(db *sql.DB, xa *dtmcli.Xa) (インターフェース{}, error)を返します{
  10. _, err := dtmcli.DBExec(db, "dtm_busi.user_account を更新し、残高をbalance-? に設定し、user_id=?" 、reqFrom(c).Amount、 1 )
  11. dtmcli.MapSuccess、エラーを返します
  12. })
  13. }))
  14. // XAトランザクションを開始する
  15. err := XaClient.XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) {
  16. 応答、エラー:= xa.CallBranch(&TransReq{金額: 30 }, Busi+ "/TransOutXa" )
  17. err != nil の場合{
  18. 応答を返す、エラー
  19. }
  20. xa.CallBranch(&TransReq{金額: 30 }, Busi+ "/TransInXa" )を返します
  21. })

要約する

この時点で、XA 分散トランザクションの完全な紹介は完了です。

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

この短い記事では、トランザクション、分散トランザクション、および XA トランザクションを処理するマイクロサービスについて概要を説明しました。興味のある学生は、dtm を通じて分散トランザクションの学習を継続できます。

<<:  2020 年に IT プロフェッショナルが取得すべき 8 つの優れたクラウド セキュリティ認定資格

>>:  スマートトラベルは「次のステップ」を迎えており、ファーウェイクラウドは西村で業界リーダーと議論している

推薦する

AppleがiPhoneから個人情報を抜き取っていたことが発覚

ロイター通信によると、アップルは最近、非公開の技術を通じて、テキストメッセージ、連絡先リスト、写真な...

高品質なコンテンツを書くためにSEOとして自分の質を高める方法

ご存知のとおり、有能な SEO 担当者にとって、ライティングは必須の基本スキルです。しかし、ほとんど...

百度のアルゴリズム改革は依然としてコンテンツに焦点を当てている

百度の最近のアルゴリズム改革は迅速かつ容赦ないもので、要件を満たさないウェブサイトはすべて死刑囚監房...

firstbyte: トラフィック無制限、最低月額9.8元のシンガポールVPSの簡単なレビュー

Firstbyte は 2009 年に設立されたロシアのホスティング会社で、世界中の 7 つのデータ...

インターネット上のゴミは至る所にあります。コミュニティはどのようにしてゴミによる被害を防ぐことができるでしょうか?

ネット荒らしはインターネット環境の一部です。実際、ネット荒らしとネット水軍には、しばしば一定の類似点...

貴州サンシャイン創新テクノロジー株式会社は、貴社がオンラインでどのようにマーケティングすべきかを教えてくれます

これは企業のオンライン マーケティングを行うためのより効果的な方法なので、Guizhou Sunsh...

再開中です! Baidu VR製品+テクノロジーの二重サポートで企業のオンラインマーケティングのアップグレードを促進

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス新型コロナウイルス肺炎の...

クラウド サービスから抽出されたデータからユーザーの位置をどのように推測できますか?

地理位置情報データは、さまざまな政府機関に必要な情報を提供することができ、法執行機関は位置データを使...

gcorelabs: 21 番目のデータ センター - スペイン、無制限の VPS、月額 3.25 ユーロからの支払い、Alipay 支払いに対応

gcorelabs の 21 番目のデータ センターが稼働を開始しました。スペインのマドリードにあり...

vpss「言葉にできない」時代-$16/1gメモリ/200gハードディスク/2Tトラフィック/Gポート/winXP/03/08

vpss「言葉にできない」時代は非常に新しいビジネスです。論理的には、私がそれを公開する必要はありま...

Alibaba Cloudがオンラインとオフラインのストレージの境界を打ち破り、クラウド定義のストレージ製品を発表

[51CTO.com からのオリジナル記事] はるか昔、人々は亀の甲羅にデータを保存していました。そ...

BATのメンバー3人が2013年フォーブス中国富豪リストのトップ10にランクイン

フォーブスは本日、2013年中国長者番付を発表した。トップ10のうち、ロビン・リー、ジャック・マー、...

K8S ベースのクラウド ネイティブ アーキテクチャのコスト最適化ガイド

鄭漢ララムーブテクノロジーセンターコアインフラ部門建築家Huolala では、Kubernetes ...

F5、マルチクラウドアプリケーションのセキュリティ向上のため自動侵入テスト機能を追加

ロンドン - 2024年3月6日 - F5(NASDAQ: FFIV)は本日、新しい自動偵察および侵...