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 のトレンド

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

推薦する

高品質の外部リンクを取得する 安心してウェブサイトのランキングを向上させる6つのポイント

1. 百科事典。この方法を使用するには、ある程度の専門知識と文学的才能が必要です。エントリを編集して...

Apple のプリインストール チャネルを失った後、Google マップはこのようにユーザーを獲得します。

中国本土のインターネットユーザーにとって Google の使用が難しいのと同様に、Google マッ...

ramnode: 年間 12 ドルから、1G メモリ/1 コア/40g SSD/1T トラフィック、ロサンゼルス/シアトル/アトランタ/ニューヨーク/アムステルダム

非常に信頼性の高い旧ブランドの VPS である Ramnode は、長年特別なプロモーションを行って...

アンダーレイにおけるマルチネットワーク ns の適用 - ヒント

みなさんこんにちは。私は次男です。前回の記事「​​Underlay でのマルチネットワーク ns の...

クラウドネイティブの高性能分散ファイルシステムであるJuiceFSは本当に興味深い

JuiceFS は、Apache 2.0 オープン ソース プロトコルに基づいてリリースされた、クラ...

corgitech-$7/softlayer/日本/シンガポール/VMware/1g メモリ/30g ハードディスク/3T トラフィック

corgitech、5年間運営しているこのVPSビジネスは、長い間私のブログに登場していませんでした...

テンセントの科学者8名が「世界の科学者の上位2%」に選出

記者は11月1日、米スタンフォード大学が10月10日に「2022年世界トップ2%の科学者」リストを発...

企業サイトのコンテンツ量を増やすための質の高いオリジナル記事作成のポイント

記事を書くのに1~2時間かかります。私の目的は、皆さんに価値ある有意義な情報を提供し、私自身の経験や...

globalfrag-プロフェッショナルなDDoS防御ホスト/仮想ホスト/VPS/サーバー

globalfrag.com は 2008 年に設立され、主に仮想ホスティング、VPS、サーバー レ...

ResearchAndMarkets: 世界のクラウド コンピューティング サービス業界は 2027 年に 3,131 億ドルに達する

海外メディアの報道によると、市場調査会社ResearchAndMarketsが発表した報告書では、C...

クラウドコンピューティングがIoTソリューションにもたらすもの

[[407671]]組織は、IoT によって生成されたデータを効率的に保存および管理するために、Io...

SEO 専門家インタビュー - 中国における SEO の分析

インタビューは主に中国語の検索と SEO に焦点を当てていました。マット・カッツ氏と Google ...

ウェブサイトのランキングに影響を与える6つの主な要因

最近、Baiduは大きなアップデートを行っておらず、ウェブマスターは非常に落ち着いていますが、多くの...

クラウド、データセンター、エッジインフラストラクチャの4つの主要トレンド

ガートナー社は、経済の不確実性が増すこの年に、インフラストラクチャおよび運用 (I&O) チ...

ウェブサイトのSEO最適化プロセスにおけるコンテンツ構築の思考方向の分析と解釈

ご存知のとおり、ウェブサイトの SEO 最適化のプロセスでは、コンテンツが第一の要素です。コンテンツ...