この記事はWeChatの公開アカウント「RememberGo」から転載したもので、著者はWu Qin Curryです。この記事を転載する場合はRememberGo公式アカウントまでご連絡ください。 導入前回の記事では、Goで実装された分散トランザクションフレームワークであるseata-golangを中心に紹介しました。 Seata に匹敵する Go 言語実装ですが、もちろんバージョンはまだ Java バージョンよりはるかに遅れています。 今回は、Go で実装された別の分散トランザクション、dtm を紹介します。 まずは、dtmの全体的なアーキテクチャ図を見てみましょう(公式サイトより)。 先ほどの seata のアーキテクチャ図をもう一度見てみましょう。 建築の観点から見ると、ほぼ同じです。 seata の TC は dam の TM に対応します。 RM 双方とも同意します。 seata の TM は、dtm トランザクション SDK に相当します。機能は同じです。最初の段階では、グローバル トランザクションが開始され、各 RM ブランチ トランザクションが実行されます。第2段階では、RMの第1段階の実行結果に応じて、TC(seata)を呼び出すことを決定する。| TM (dtm) コミットまたはロールバック。 アーキテクチャの面では、モジュール名と画像だけが異なっていると個人的に感じています。もちろん、実装の詳細にはまだ大きな違いがあります。 まず、DTM の各モジュールについて簡単に紹介します。 TMTM レイヤーのコードには特定のメイン構造はなく、すべては関数の前の呼び出しから始まります。 TM を起動すると、実際には http と grpc の 2 つのサービスが起動します。 httpルーティング、 gRPCインターフェース、 サービスエントランスが2つあるので、コア業務をこなすパブリックな部分は当然あるはずです。 TM のデータ ストレージ管理は、インターフェイスではなく、common.DB 構造に依存します。基盤となるデータベースは、構成ファイルの DB.driver の値に応じて、mysql または postgres のいずれかになります。 改めてDB構造を見てみると、下層でどのようなデータベースが使われているかに関係なく、データの操作は直接gormに依存しています。 次に、TM が各 RM にコミットまたはロールバックを通知する方法を見てみましょう。 TCC モデルの例を見てみましょう。 TCC の 2 つのステージ。
上記から、TCC モードでは、TM が第 2 フェーズで各ブランチ トランザクションに確認またはキャンセルを通知することがわかります。 各 RM トランザクション ブランチを TM に登録すると、TM は最終的に分散トランザクションの参加者 (RM) ごとに 2 つのブランチ情報を生成します。 このように、 はい、対応する RM リソース操作アドレスを直接保存するだけです。 TM は、コミットまたはロールバック コマンドを受信すると、独自のロジック (通常は Gloable ステータスの変更) を処理した後、登録されている各ブランチ トランザクションの処理を開始する必要があります。簡単に言えば、各ブランチトランザクションの操作に対応するインターフェースを呼び出す必要があります。 ここで、t.getProcessor() は、論理処理を実行するために、現在のトランザクションのタイプ (TCC、SAGA、XA) に応じて対応するプロセッサを取得する必要があります。 もちろん、各トランザクションプロセッサはインターフェースを実装するだけで済みます。 実際に RM リソース サービスのアドレスを呼び出す場合、http と grpc に分かれており、どちらになるかは開発者によって決まります。 v1.6 より前のバージョンでは、grpc リクエストは単にアドレスを解析して接続するだけの大雑把な方法でした。 現在、gRPC リゾルバ メカニズムを使用する一部のマイクロサービス フレームワークのアクセスをサポートするために、抽象化が行われています。興味のある方は[1]をご覧ください。ここでは紹介しません。 開発キットSDK に関しては、各トランザクション モードは独立しており、本質的に無関係です。たとえば、以下のように TCC 分散トランザクションを開始してみましょう。この分散トランザクションは、+30 サービスと -30 サービスと呼ばれる 2 つのサービスで構成されます。
言及すべきもう 1 つの点は、空の補償、再ハングなど、分散トランザクションに共通するいくつかの問題です。 一般的に言えば、企業は言語に絶するほどのエラーを回避するために、このシナリオを自ら処理する必要があります。 対応するサブトランザクション バリア ソリューションは dtm で提供されます。核心はここにあります。 実際には、データベースの一意のインデックス メカニズムを使用することになります。もちろん、RM リソースごとに新しいテーブルを追加する必要があります。 前述のように、dtm の TM の役割は基本的に seata の TC に対応しますが、処理モードは異なります。 dtm の TM は、登録時に各ブランチによって保存されたアドレスに基づいて、各 RM 操作を http または rpc 経由で呼び出すかどうかを決定します。 RM へのリクエストは TM によって直接開始されます。 seata-go の実装では、TC は RM を直接呼び出すことには参加しません。 前回の記事で双方向ストリーム RPC インターフェース (BranchCommunicate) について説明したことを思い出してください。 TC はこのインターフェースを通じて対応するブランチ処理情報を RM マネージャーに渡します。 次に、RM マネージャーはトランザクション タイプに基づいて処理する対応するトランザクション マネージャーを選択し、最後に対応するトランザクション タイプ マネージャーの BranchCommit メソッドを呼び出します。 以下は、TCC トランザクション タイプ マネージャーのプロセスです。 対応するトランザクション RM マネージャーが各 RM リソースに通知し、処理する方法。 原理は前回の記事で述べた著者が実装したグローバルトランザクションプロキシモードです。基本的には Go リフレクションを使用して実装されます。興味があれば、ソースコードをダウンロードするか、著者によるグローバルトランザクションプロキシの実装の紹介[2]を読んでみてください。 要約するこの記事では主に、dtm 実装の詳細を紹介します。これら 2 つの記事から、実装におけるいくつかの違いを大まかに把握できます。詳細は自分で調べる必要があります。 最後に、いくつか質問があります。
関連している https://zhuanlan.zhihu.com/p/351391359 https://dtm.pub/protocol/support.html |
<<: VMware は、企業のデジタル変革を促進する 3 つのシナリオに対応するクラウド ネットワーキング ソリューションでゼロ トラスト接続を構築します。
>>: クラウド コンピューティングとエッジ コンピューティングのどちらを選択しますか?企業はエッジコンピューティングの適用可能なシナリオと利点を理解する必要がある
bbr [TCP BBR 輻輳制御アルゴリズム] を紹介します。これは Google の成果です。B...
ukrnames は 2007 年に設立され、2008 年に ICANN 認定を取得しました。同社の...
はじめに: HootSuite の CEO が、広告に 1 円も費やすことなく 500 万人の消費者...
数日前、SEOテクノロジーはBaiduの検索結果公式サイトのサブチェーンであるSitelinkに注目...
ウェブサイトの開設は、企業の認知度を高めるためだけではなく、企業の利益を高めるためにも重要です。こう...
世の中には、他人が金儲けをしていることに嫉妬する人が常にたくさんいます。WeChatのような優れた製...
中小企業の生産維持を支援し、国全体が疫病と闘い、健康を守るのを支援します。テンセントクラウドは、企業...
成都小人居科技のブランド「加速クラウド」は、新しい高防御コンピュータルーム「四川西部雅安ビッグデータ...
多くの人は、数年前の SEO 最適化方法にとらわれており、毎日疑似オリジナルコンテンツを書き、外部リ...
はじめに:最近デザインドキュメントを共有しようと計画していましたが、キーノートを整理する時間がありま...
2013 年に卒業したとき、私はとても興奮していました。私が待ち望んでいた社会生活を、ついに経験する...
8,000 万人のアクティブなモバイル アプリケーション ユーザー、3,000 人の従業員、10 年...
GoogleはC2C教育製品の発売を計画しており、「Taobao Classmates」が正式に発売...
2006年に設立された有名なVPSブランドであるVirpusは、本日、特別な「ベアメタルサーバー」を...
AWS、Azure、Google Cloud は長期にわたる戦いを繰り広げています。 AWS はクラ...