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

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

[[440473]]

この記事は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 の各モジュールについて簡単に紹介します。

TM

TM レイヤーのコードには特定のメイン構造はなく、すべては関数の前の呼び出しから始まります。

TM を起動すると、実際には http と grpc の 2 つのサービスが起動します。

httpルーティング、

gRPCインターフェース、

サービスエントランスが2つあるので、コア業務をこなすパブリックな部分は当然あるはずです。

TM のデータ ストレージ管理は、インターフェイスではなく、common.DB 構造に依存します。基盤となるデータベースは、構成ファイルの DB.driver の値に応じて、mysql または postgres のいずれかになります。

改めてDB構造を見てみると、下層でどのようなデータベースが使われているかに関係なく、データの操作は直接gormに依存しています。

次に、TM が各 RM にコミットまたはロールバックを通知する方法を見てみましょう。

TCC モデルの例を見てみましょう。

TCC の 2 つのステージ。

  • ステージ1: 試してみる。実行を試行し、各 RM によってカスタマイズされた try 動作を呼び出し、必要なビジネス リソースを予約します。
  • フェーズ 2: 確認 (フェーズ 1 でこのトランザクションに参加しているすべての試行動作が成功します)。各ブランチ トランザクションの Confirm メソッドを呼び出して実際にビジネスを実行し、try フェーズで予約されたリソースのみを使用します。
  • フェーズ 2: キャンセル (フェーズ 1 でこのトランザクションに参加したすべての try 動作が失敗します)。各ブランチ トランザクションの Cancel メソッドを呼び出して、try の最初のフェーズ用に予約されたリソースを解放します。

上記から、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 つのサービスで構成されます。

  • 上記の呼び出しから、プロセス全体を復元できます。
  • 分散IDを取得するにはTMを呼び出します
  • 分散トランザクションを開始するには、TccGlobalTransaction 関数を呼び出します。
  • TM prepare を呼び出します (このステップは、最初のステップで生成された分散トランザクション ステータスが準備中であるかどうかを確認するだけです。ここがわかりません。実行ブランチはこの時点では登録されていません。グローバル ステータスは初期化ステータスにのみ存在するべきではないでしょうか?)
  • 前のステップは問題ありません。渡されたクロージャ関数、つまり CallBranch 関数で TM にトランザクションを登録する TM ブランチが実行されます。登録が完了すると、各ブランチの try サービスを呼び出すことによって最初のフェーズが始まります。
  • 各ブランチがサービス呼び出しを完了しようとすると、最初のステージの結果に基づいて、TM に送信するか中止するかが通知されます。

言及すべきもう 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 つのシナリオに対応するクラウド ネットワーキング ソリューションでゼロ トラスト接続を構築します。

>>:  クラウド コンピューティングとエッジ コンピューティングのどちらを選択しますか?企業はエッジコンピューティングの適用可能なシナリオと利点を理解する必要がある

推薦する

ウェブ解析を行う際に必ず聞くべき10の質問(パート1):ウェブサイトの目標、戦略、ユーザーについて

半年近くブログを更新していませんが、理由の一つは忙しいから、もう一つは怠けているからです。仕事以外に...

テンセントのルール変更がタオバオアフィリエイトに与える影響(第2部):悪質なマーケティング活動への対策

前回の記事「テンセントのルール変更がタオバオアフィリエイトに与える影響(パート1)」では、テンセント...

vpscheap-年間$10/256MBメモリ/3GB SSD/30MB無制限/シカゴ

vpscheap.net ではプロモーションを行っています。ブラックフライデーのプロモーションとは呼...

ウェブサイトのユーザーを育成し、維持する方法について簡単に説明します。

長い間何も書いていませんでした。怠惰は誰にでも共通する問題であり、もちろん私も例外ではありません。最...

グーグルはスナップチャットを40億ドルで買収しようとしたが拒否されたと報じられている

新浪科技報、北京時間11月15日朝のニュースによると、米国のテクノロジーブログGigaOmのブロガー...

CSS3 背景画像の詳細な理解

月収10万元の起業の夢を実現するミニプログラム起業支援プラン背景画像を設定するには、backgrou...

cloudcone: 超大容量ハードディスク VPS 再入荷、ロサンゼルス KVM、最大 500G ハードディスク、PayPal/Alipay

cloudcone は、電子メール マーケティング用の大容量ハード ドライブ VPS (ストレージ ...

「エッジコンピューティングは『ワイヤレス』で可能」レノボがThinkSystemエッジサーバーをリリース

本日、「エッジコンピューティングの『ワイヤレス』の可能性」をテーマにしたLenovo ThinkSy...

A5最適化チーム:ウェブサイト外部リンクの健全性のSEO診断

ウェブサイトの最適化のプロセスにおいて、最も重要なリンクの1つは外部最適化であり、これはしばしば外部...

SEO 市場の標準化、Google ウェブマスター アカデミーが開始

Webmaster Academy へようこそ! 私たちの目標は、Google 検索結果で優れたパフ...

Baidu のホームページで自社をしっかりと位置付けるための実践的な詳細の共有

ご存知のとおり、企業ウェブサイトのランキングは、検索エンジン最適化プロセスにおいて誰もが追求する共通...

ブランドマーケティングプロモーション:マーベルIPのブランドポジショニング戦略を分析!

存在するか、存在しないか?それが問題だ。 『アベンジャーズ4』の興行収入の大成功の裏には、暗黙の事実...

クラウド移行はますます困難になる

現在、多くの企業が単純なものを移行しているため、時間の経過とともに困難になってきていますが、それでも...

hostus-$6/6g メモリ/6gSwap/150g ハードディスク/5T トラフィック/3IPv4

Hostus は、月額 6 ドルで 6G のメモリ、150G のハード ドライブ、5T のトラフィッ...