マイクロサービスアーキテクチャによる分散トランザクションソリューション

マイクロサービスアーキテクチャによる分散トランザクションソリューション

[[426291]]

ビジネスの急速な発展とビジネスの複雑性の増大に伴い、従来のモノリシック アプリケーションでは、開発効率の低さ、保守性の低さ、アーキテクチャのスケーラビリティの低さ、柔軟な展開のなさ、堅牢性の低さなど、いくつかの問題が徐々に明らかになってきています。

マイクロサービス アーキテクチャは、業務に応じて独立したサービス ユニットに分割された分散システムであり、モノリシック システムの欠点を解決しながら、ますます複雑化するビジネス ニーズにも対応します。各マイクロサービスは、1 つのタスクのみを適切に実行することに重点を置いています。

マイクロサービスアーキテクチャの特徴

マイクロサービス アーキテクチャの利点は非常に明白であり、近年急速に発展しています。

  1. 複雑なビジネスを複数の小規模ビジネスに分割すると、ビジネスの再利用性が向上し、人員編成や分業が容易になります。
  2. サービスは独立して展開および拡張され、各サービスの変更および展開は他のサービスに影響を与えません。
  3. 各サービスは、ビジネスシナリオに基づいて適切なプログラミング言語とデータベースを選択できます。

マイクロサービスには上記のような利点がありますが、次のような多くの新たな問題も生じます。

  1. サービスの数が多くなると、テスト、展開、監視が難しくなります。
  2. モノリシックアプリケーションが分散システムに分割されると、プロセス間の通信メカニズムと障害処理対策がより複雑になります。
  3. システムをマイクロサービス化すると、元々サービス内にあったローカル データベース トランザクションが複数のサービスに分割され、分散環境でトランザクションの一貫性を確保する必要があります。

上記の問題のうち、1と2は近年登場したさまざまなマイクロサービス技術によって解決できます。たとえば、Kubernetes はサービス検出とサービスガバナンスを提供します。したがって、分散トランザクションは、マイクロサービスの実装に対する最大の障害となり、最も困難な技術的問題にもなっています。以下では、マイクロサービス アーキテクチャにおける分散トランザクションのソリューションについて詳しく説明します。

ローカルトランザクションから分散トランザクションへの進化

送金を例に挙げてみましょう。 A が B に 100 元を送金する必要がある場合、A の残高は -100 元、B の残高は +100 元である必要があります。単一ボディモードでは、ローカルトランザクションを通じてこれを解決できます。

地方問題

複数のステートメントをまとめて操作する機能をデータベーストランザクションと呼びます。データベース トランザクションにより、トランザクションのスコープ内のすべての操作が成功または失敗することを保証できます。トランザクションが失敗した場合、SQL ステートメントが実行されなかった場合と同じ結果となり、データベース データは変更されません。

データベース トランザクションには、次の 4 つの ACID 特性があります。

  • A: アトミック、アトミック性、すべての SQL をアトミック作業単位として実行します。すべてを実行するか、まったく実行しません。
  • C: 一貫しています。トランザクションが完了すると、すべてのデータのステータスが一貫したものになります。つまり、アカウント A から 100 を減算する限り、アカウント B に 100 を追加する必要があります。
  • I: 孤立。複数のトランザクションが同時に実行される場合、各トランザクションによって行われた変更は他のトランザクションから分離される必要があります。
  • D: 期間、永続性。つまり、トランザクションが完了した後、データベース データへの変更は永続的に保存されます。

分散トランザクションの典型的なシナリオ

銀行間送金業務は、典型的な分散型トランザクションのシナリオです。 A が銀行間で B に送金する必要がある場合、2 つの銀行のデータが関係します。転送の正確性は、データベースのローカル トランザクションでは保証できず、分散トランザクションを通じてのみ解決できます。

サービスをマイクロサービスに分割する場合、分散トランザクションを必要とするシナリオが多数あります。マイクロサービスのベスト プラクティスでは、分散トランザクションを可能な限り回避することが推奨されていますが、多くのビジネス シナリオでは、分散トランザクションは避けられない技術的な問題です。

分散トランザクションソリューション

一般的な分散トランザクション モードには、XA、TCC、SAGA、信頼性の高いメッセージングなどがあります。以下は簡単な紹介です

2 フェーズ コミット/XA

XA は、X/Open 組織によって提案された分散トランザクション仕様です。 XA 仕様は主に、(グローバル) トランザクション マネージャー (TM) と (ローカル) リソース マネージャー (RM) 間のインターフェイスを定義します。 MySQL などのローカル データベースは、XA で RM の役割を果たします。

XA は 2 つの段階に分かれています。

最初のフェーズ (準備): 参加しているすべての RM がトランザクションの実行を準備し、必要なリソースをロックします。参加者の準備ができたら、TM に準備ができたことを報告します。

フェーズ 2 (コミット/ロールバック): トランザクション マネージャー (TM) は、すべての参加者 (RM) の準備ができていることを確認すると、すべての参加者にコミット コマンドを送信します。

現在、MySQL、Oracle、SQLServer、PostgreSQL など、ほとんどの主流データベースは XA トランザクションをサポートしています。

正常に完了した XA トランザクションのタイミング図は次のとおりです。

TCC事業計画

TCC ソリューションは、実際には XA 送信の改善です。ビジネス ロジック全体の各ブランチを、Try、Confirm、Cancel の 3 つの操作に明示的に分割します。 try 部分はビジネスの準備を完了し、confirm 部分はビジネスの送信を完了し、cancel 部分はトランザクションのロールバックを完了します。

トランザクションが開始されると、ビジネス アプリケーションはトランザクション コーディネータに登録してトランザクションを開始します。次に、ビジネス アプリケーションはすべてのサービスの try インターフェイスを呼び出して、準備の最初の段階を完了します。トランザクション コーディネータは、try インターフェイスの戻りステータスに基づいて、confirm インターフェイスを呼び出すか、cancel インターフェイスを呼び出すかを決定します。 API 呼び出しが失敗した場合は再試行されます。

正常に完了した TCC トランザクションのタイミング図は次のとおりです。

SAGA事業計画

Saga は、TCC と同様に、最終的に一貫性のあるトランザクションであり、柔軟なトランザクションでもあります。 Saga の本質は、長いトランザクションを小さなトランザクションに分割し、各トランザクションに実行モジュールと補正モジュールを含めることです。

Saga は try を使用せず、トランザクションを直接コミットするため、ダーティ リードが発生する可能性があります。これは、一貫性の要件が高い一部のシナリオでは受け入れられません。

Saga トランザクションを開始すると、トランザクション マネージャーは最初の Saga 参加者 (サブトランザクション) にローカル トランザクションを実行するように指示します。トランザクションが完了すると、Saga は実行順に Saga の次の参加サブトランザクションを呼び出します。このプロセスは、Saga トランザクションが完了するまで継続されます。

サブトランザクションの実行中にサブトランザクションに対応するローカル トランザクションが失敗した場合、Saga は逆の順序で補正トランザクションを実行します。

正常に完了した SAGA トランザクションのタイミング図は次のとおりです。

信頼できるニュース

メッセージ一貫性ソリューションは、メッセージ ミドルウェアを通じて上流および下流のアプリケーション データ操作の一貫性を保証します。基本的な考え方は、ローカル操作とメッセージ送信をローカル トランザクションに配置して、ローカル操作とメッセージ送信の両方が成功するか、両方が失敗するかを確実にすることです。ダウンストリーム アプリケーションはメッセージ システムをサブスクライブし、メッセージを受信した後に対応する操作を実行します。

RocketMQ は、参照できる典型的な信頼性の高いメッセージ インターフェイスを提供します。

分散トランザクションオープンソースプロジェクト

現在、分散トランザクション分野では、Seata に代表される Java 言語のオープンソース プロジェクトが存在します。非Java分野ではGo言語のDTMが代表的なプロジェクトです。 DTM は、XA、TCC、SAGA、および信頼性の高いメッセージングをサポートします。アーキテクチャ図は次のとおりです。

図中の役割は XA モデルのロール モデルと一致しており、次のように説明されます。

  • AP アプリケーション (トランザクションの定義と送信、現在は Go 言語をサポートしており、近々 Nodejs、Python、PHP、Rust などもサポートされる予定です)
  • RM リソース マネージャー (ローカル業務の管理を担当、言語制限なし、HTTP 関連のインターフェイスが提供されている限り)
  • TM トランザクション マネージャー (DTM、グローバル トランザクションの調整、コミット、ロールバック)

上記のアーキテクチャ図では、AP は、既存のマイクロサービスにほとんど影響を与えない DTM によって提供される分散トランザクション インターフェイスを介して RM および TM と対話します。

また、実際の業務では、AP と RM の役割が重複することもあります。たとえば、TCC モードでは、AP は独自のローカル トランザクションを持つことができ、他のトランザクション ブランチを登録して呼び出すこともできます。

<<:  ストレージ仮想化ソフトウェアのオプションに関する知識

>>:  ビッグ3がハイブリッドマルチクラウドゲームで勝てない理由

推薦する

Bilibiliはサークルから抜け出したが、なぜまだ損失を出しているのか?

設立から11年が経過した企業にとって、収益化への道のりにおける模索期間は長すぎるように思われます。現...

中小企業はネットワークマーケティングを行う際に賢くお金を使うべきである

私は10年間、企業のインターネットマーケティングに携わってきました。初期の企業群から今日のインターネ...

主要なインターネットイベントに関する推測と雑談、そして2011年の概要

主要なインターネットイベントに関する推測と雑談、そして2011年の概要現在、インターネットは急速に発...

レンタカー業界でソフトコンテンツマーケティングを行うための4つの重要なステップ

以前、友人から、伝統的な業界の会社を経営しているのに、現在のインターネット ソフト テキスト マーケ...

ウェブサイトの運営にはオフラインとオンラインを組み合わせる必要がある

インターネットでお金を稼ぎたい個人ウェブマスターとして、私が毎日最も考えているのは、自分のウェブサイ...

もしあなたのウェブサイトが誤って Baidu から消えてしまったら、Baidu を責めるでしょうか?

6月22日から、Baiduは多くのサイトの格下げを開始しましたが、当時は現在ほど深刻ではありませんで...

百度重量とは何ですか?メン先生が百度重量について詳しく説明します

Baidu ウェイトとは何ですか? Baidu ウェイトとは何ですか? これは、ここ数日ネットユーザ...

ウェブサイトのプレビュー: 新しいウェブサイトの立ち上げを急がないでください

他のウェブマスターと話し合った結果、Xiaomao は、新しいウェブサイトを構築した友人たちが皆、ウ...

事例分析:企業ウェブサイトのターゲットキーワードの見つけ方

SEO ランキングが必要なウェブサイトの場合、ウェブサイトのキーワードの位置付けが初期段階で不正確で...

Google Cloud が SAP RISE プログラムに参加

[51CTO.com クイック翻訳] Google Cloud は、エンタープライズ ソフトウェア大...

中国電信の新ドメイン名の歴史の逆転はあなた次第

最近、中国電信はオンラインビジネスホールの新しいドメイン名を導入する移行作業を開始しました。このドメ...

zjinet: 香港 Huawei クラウドライン物理マシン、450 元/月、E3-1231v3/16g メモリ/480gSSD/5M 帯域幅

今月、zjiは香港のHuaweiクラウドサーバーと同じラインで、Huaweiの香港IPを使用して独立...

DevOpsレビュー

DevOps の出現は、「左シフト運動」の具体的な現れです。ソフトウェア製品とサービスを時間どおりに...

第二に、贅沢経済のライブ放送の傾向

かつて、贅沢品は上流階級の独占物であり、社会的地位の象徴でした。しかし、大多数の一般の人々にとって、...

偽造証明書ギャングが政府ウェブサイト185件に侵入、容疑者165人を逮捕

地図:呉尚南押収された偽のバッジ。 写真は記者の欧陽暁飛による偽造証明書を本物らしく見せるために、偽...