この記事は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 つのシナリオに対応するクラウド ネットワーキング ソリューションでゼロ トラスト接続を構築します。
>>: クラウド コンピューティングとエッジ コンピューティングのどちらを選択しますか?企業はエッジコンピューティングの適用可能なシナリオと利点を理解する必要がある
予算が限られている多くの友人は、安価なサーバー(安価な海外サーバー)を必要としており、安価なサーバー...
bgp.to は、日本とシンガポールのデータセンターの独立サーバーに特別プロモーションを提供していま...
12月23日、エンタープライズWeChatバージョン3.0がリリースされ、業界に大きな衝撃を与えまし...
最近、ウェブサイトを運営している人たちはWeiboマーケティングをやったことがないので、会ったときに...
クラウド コンピューティングは、ほとんどの人が認識しているよりもはるかに大きなものです。その影響はビ...
今日、私は「Baidu 推奨エンジン」という新しい用語を見ました。百科事典では、これはユーザーの現在...
編集者注: この記事の著者は、Tencent Weibo Open Platform の Xu Zh...
ヘルスケア業界がクラウド コンピューティングを使用してデジタル変革を加速し、大量のデータを処理し、コ...
北京大学インターネット発展研究センターが9月1日に発表した「オンライン会議の社会的価値と今後の発展報...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますモバイル決...
皆さんは百度百科事典をよく理解していると思います。 Baidu Encyclopedia は Bai...
今日、インターネットで質疑応答を見ました。内容は、SEOについて何も知らない上司に、SEOをうまく行...
新しい販売業者である digital-vm (年に設立、ルーマニアに登録、登録番号 J40/3876...
みなさんこんにちは。私は草の根のキャンパスウェブマスターです。SEOについてはあまり詳しくありません...
私のブログを長い間フォローしている若い人たちは、8月にvirmachが初めてサーバー上で起動されたと...