Goで実装された分散トランザクションフレームワーク

Goで実装された分散トランザクションフレームワーク

[[439474]]

この記事はWeChatの公開アカウント「RememberGo」から転載したもので、著者はWu Qin Curryです。この記事を転載する場合はRememberGo公式アカウントまでご連絡ください。

導入

気がつけば1ヶ月も更新していませんでした。一度怠け者になると、ますます怠け者になるだけだ。

最近、分散トランザクションに興味を持ち、いくつかの記事や論文を読みました。この記事は主に私が見た 2 つのプロジェクトを紹介するもので、理論的な知識は含まれていません。

  • Alibaba の Seata のオープンソース バージョン。主に seata-golang の Go 実装 (Java バージョンの背後) に注目しています。
  • そして、しばらく前に多くの公開アカウントが投稿した DTM。

シータの紹介

Seata は、Alibaba が提供するオープンソースの分散トランザクション サービスです。現在、AT、TCC、SAGA、XA トランザクション モードをユーザーに提供しており、全体として 2 フェーズ コミット プロトコルを採用しています。 seata-golang の Go バージョンは現在、MySQL の AT モードと TCC モードのみを実装しているようで、作者は現在ほとんど更新していません。

Seata にはいくつかの主要な役割があります。

  • TC (トランザクション コーディネーター) - トランザクション コーディネーター。 (グローバルおよびブランチトランザクションの状態を維持し、グローバルトランザクションのコミットまたはロールバックを実行します)
  • TM (トランザクション マネージャー) - トランザクション マネージャー。 (グローバル トランザクションのスコープを定義します。グローバル トランザクションを開始し、グローバル トランザクションをコミットまたはロールバックします。)
  • RM (リソース マネージャー) - リソース マネージャー。 (ブランチ トランザクション処理のリソースを管理し、TC と通信してブランチ トランザクションを登録し、ブランチ トランザクションのステータスを報告し、ブランチ トランザクションをコミットまたはロールバックします)

もちろん、これだけでは分かりにくいかもしれませんので、公式サイトから画像を使って説明しましょう。

上の図からわかるように、これら 3 つの役割の責任は次のとおりです。

TC

  • グローバルおよびブランチ トランザクションの状態を維持するには、ストレージが必要です。
  • 分散トランザクションが完了すると、各 RM にコミットするかロールバックするかを通知する必要があります。

TM

  • TC に分散トランザクションを開始し、グローバルに一意の分散 ID を取得するよう要求します。
  • 最初のフェーズで分散トランザクションに参加している各 RM からのフィードバックに基づいて、2 番目のフェーズで TC に分散トランザクションのコミットまたはロールバックを要求するかどうかを決定します (ほとんどのシナリオでは、最初のフェーズでいずれかの RM に障害が発生すると、分散トランザクションは失敗します)。

RM

簡単に言えば、分散トランザクションに関係するさまざまなサービス(従来の注文シナリオに関係する注文サービス、在庫サービス、マーケティングサービスなど)を管理します。

ps: 個人的には、ここでの RM はマイクロサービスの中間処理層に少し似ていると感じています (専門用語では、これをフロントエンドの bff->backend と呼びます)。

  • 1 段階の準備動作 (アクティブ): 各 RM はカスタマイズされた準備ロジックを呼び出します。
  • 第 2 段階のコミット動作 (パッシブ トリガー): この分散トランザクションの第 1 段階ですべての RM が成功した場合、TC は自身の状態変更を処理した後、各 RM のカスタム コミット ロジックを呼び出します。 (第1フェーズのすべてのRMは成功しました)
  • 第 2 段階のロールバック動作 (パッシブ トリガー): この分散トランザクションの第 1 段階でいずれかの RM が失敗した場合、TC は独自の状態変更を処理した後、各 RM のカスタマイズされたロールバック ロジックを呼び出します。 (どのRMも最初の段階で失敗します)

大丈夫。以下に、seata-golang の実装の詳細を示します。 seata-golang の基盤となるレイヤーでは、通信に gRPC を使用します。

シータ-ゴラン

まず、RM 構造を見てみましょう。

マネージャーに関しては、サポートされている主要なトランザクション モードの実装 (TCC、XA など) を保存し、各モードではこのインターフェイスを実装するだけで済みます。

TC の部分構造を見てみましょう (いくつかのフィールドを削除します)。

TC は現在、データ ストレージとして MySQL と pgsql をサポートしています。つまり、SessionManager インターフェイスを実装し、それを SessionHolder のマネージャーに挿入するだけです。

これら 2 つの基本構造を紹介した後、それらの関係について上で述べたことを覚えていますか?

第 2 段階では、TC は現在のトランザクション ステータスに基づいて、コミットするかロールバックするかを RM に通知します。

ResourceManagerを初期化するとき、

最後に TC の grpc インターフェース branchCommunicate が呼び出されることがわかります。

サーバーに対応しています。

gRPC には 4 つの基本的な通信モードがあることがわかっています。

  • 単項RPC
  • サーバーストリーミングRPC
  • クライアントストリーミングRPC
  • 双方向ストリーミング RPC

ストリーミング形式を希望するのも非常に簡単です。 proto メソッド定義内の対応する request|response パラメータの前にストリーム タグを追加するだけで、このインターフェイスがストリーミングされます。ストリームの種類は、ストリームを追加する場所によって異なります。リクエストとレスポンスの両方を追加すると、双方向ストリームになります。

クライアントとサーバーは両方とも、stream.Send を介してリクエストを送信し、stream.Recv を介してデータを受信できます。

RMがBranchCommunicateを呼び出すと、

最後に、ブランチ トランザクションが処理され、manager.BranchCommit が呼び出されます。

同様に、TCがRMによって呼び出されると、

コミットまたはロールバックを通知するために RM に送信されるデータはどこから来るのでしょうか?

TCがRMにブランチをコミットするように通知したい場合、

最後はTMですが、これは理解するのが難しくありません。

実際、seat-golang については言及する価値のあることが他にもあります。

たとえば、go リフレクションによって実装された動的プロキシ関数を書くのは面倒です (まったく不要だと思いますが)。

この記事はもう一回書くと長くなるので、dtmについてはこれ以上書きません。ご興味がございましたら、メッセージを残していただければ、DTM を作成するかどうか検討させていただきます。

参照する

https://seata.io/zh-cn/docs/overview/what-is-seata.html

https://github.com/opentrx/seata-golang

<<:  2022 年に IT 業界、労働力、ビジネス モデルに影響を与える可能性のあるトップ 10 のトレンド

>>:  クラウドファーストのトレンドの中でクラウドインテリジェンスを実現する方法

推薦する

ポップマート:流行のおもちゃ市場のスーパーIP?

最近、香港株式市場に上場している流行玩具メーカーのポップマートが最新の半期報告書を発表した。データに...

5Gとモバイルエッジコンピューティングがあなたの生活を変える10の方法

モバイル エッジ コンピューティング (MEC) は、マルチアクセス エッジ コンピューティングとも...

ソフト記事2本で問い合わせコンバージョン率を9倍に高めた体験談

ソフトコンテンツマーケティングは、近年広く普及しているオンラインマーケティング手法です。しかし、著者...

Baidu を使用して正確なロングテールキーワードをマイニングする方法を分析する

ロングテールキーワードは、もたらされるトラフィックが非常に正確であり、ユーザーの検索目的も非常に明確...

Google オプティマイズ ウェブマスター ガイドライン

これらのガイドラインに従うことは、Google による発見、インデックス登録、ランク付けに非常に役立...

racknerd: 米国の大型ハードディスク サーバー、509 ドル、2*e5-2640v2、64G メモリ、250gSSD+160T SAS、200T トラフィック/月

Racknerdはこれまで、米国ユタ州で超大型160Tハードドライブを搭載したストレージサーバーを発...

ローカルウェブサイト運営の「4つの診断方法」:観察、聴取、質問、触診

ローカルウェブサイトの運営とプロモーションに携わるウェブマスターには、一定の文化的リテラシー、基本的...

検索エンジンの目標はSEOを排除することであり、SEOスペシャリストもユーザーエクスペリエンスによって消滅するだろう

はじめに: 今後、SEO は立場ではなく、考え方や戦略のようなものになるでしょう。ウェブサイト管理者...

医療業界ではどのようなマーケティング手法が今でも有効であるかを簡単に分析する

医療業界におけるオンラインマーケティングに関しては、誰もが喜びと不安が入り混じった気持ちを抱いている...

Baidu が再び更新: ブラック ジューンに別れを告げ、ブラック フライデーを歓迎

朝、パソコンの電源を入れ、いつものように手元のウェブサイトのSEO情報を確認しました。すると、Bai...

Baidu のリンクペナルティの圧力が強い中、外部リンクは何をすべきでしょうか?

10月23日、百度はリンクアルゴリズム更新レポート「ハイパーリンク不正行為に対するアルゴリズムアップ...

テクノロジースタック |有名なクラウドコンピューティング仮想化についての簡単な説明

[[252954]] Wikipedia によると、クラウド コンピューティングとは、インターネット...

Baidu の無料ブログへの賞賛を分析して理解する(参考のみ)

はじめに: 私は何度も大手プラットフォームでのブログをやめ、さまざまなブログを何度も使いました。何度...

ウェブサイトをキャンセルするのは非常に困難です。15のウェブサイトのうち40%がプライバシーを保護していません

法制晩報(記者:李松平英英一多)オンラインショッピングをした後、第三者のプロモーション情報が届き、ホ...

クラウドにおけるアプリケーションの依存関係の管理: 戦略とベスト プラクティス

アプリケーション依存関係マッピングの基礎、クラウド コンピューティング環境におけるアプリケーション依...