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

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

推薦する

無料のVPSサーバー速度最適化ネットワーク:BBR、ワンクリックインストール

bbr [TCP BBR 輻輳制御アルゴリズム] を紹介します。これは Google の成果です。B...

ウクライナのビジネス紹介: ukrnames、VPS+専用サーバー

ukrnames は 2007 年に設立され、2008 年に ICANN 認定を取得しました。同社の...

HootSuite CEO: 何もないところから何百万人ものユーザーを引き付ける秘訣

はじめに: HootSuite の CEO が、広告に 1 円も費やすことなく 500 万人の消費者...

Baidu サイトリンクと ICP 申請情報表示の簡単な分析

数日前、SEOテクノロジーはBaiduの検索結果公式サイトのサブチェーンであるSitelinkに注目...

コンバージョン率の向上に役立つウェブサイトはどのようなものでしょうか?

ウェブサイトの開設は、企業の認知度を高めるためだけではなく、企業の利益を高めるためにも重要です。こう...

WeChatは大きなプレッシャーの下でマーケティング開発戦略を採用する必要がある

世の中には、他人が金儲けをしていることに嫉妬する人が常にたくさんいます。WeChatのような優れた製...

テンセントクラウド、中小企業10万社の困難克服を支援する防疫支援計画を開始

中小企業の生産維持を支援し、国全体が疫病と闘い、健康を守るのを支援します。テンセントクラウドは、企業...

加速クラウド:「四川省西部雅安」300G高防御サーバー、バックボーン直結1.8ミリ秒、月額650元から

成都小人居科技のブランド「加速クラウド」は、新しい高防御コンピュータルーム「四川西部雅安ビッグデータ...

2018 年のウェブサイト SEO 最適化の 8 つのエッセンス

多くの人は、数年前の SEO 最適化方法にとらわれており、毎日疑似オリジナルコンテンツを書き、外部リ...

製品インタラクションデザイン: 実用的で美しいデザインドキュメントを作成する方法

はじめに:最近デザインドキュメントを共有しようと計画していましたが、キーノートを整理する時間がありま...

SEOへの道: 混乱に陥り、スキルを磨く

2013 年に卒業したとき、私はとても興奮していました。私が待ち望んでいた社会生活を、ついに経験する...

Dianpingはどのようにして「ゆっくりと」O2Oクローズドループを実現したのでしょうか?

8,000 万人のアクティブなモバイル アプリケーション ユーザー、3,000 人の従業員、10 年...

オンライン教育:インターネット金融に続く次の「お金の道」

GoogleはC2C教育製品の発売を計画しており、「Taobao Classmates」が正式に発売...

#サーバー# virpus-$49/デュアルソケット L5639 (12 コア)/72G メモリ/500x2 ハードディスク/5T トラフィック/シアトル

2006年に設立された有名なVPSブランドであるVirpusは、本日、特別な「ベアメタルサーバー」を...

2022年第2四半期、3大クラウドベンダーの全体的な収益は総じて減少した。

AWS、Azure、Google Cloud は長期にわたる戦いを繰り広げています。 AWS はクラ...