分散トランザクションを解決するにはどうすればいいでしょうか?きっぱりと明らかにしましょう!

分散トランザクションを解決するにはどうすればいいでしょうか?きっぱりと明らかにしましょう!

  [[409803]]

分散トランザクションの基礎

取引

トランザクションとは操作単位を指します。この操作単位内のすべての操作は、最終的に一貫した動作を維持する必要があります。すべての操作が成功するか、すべての操作がキャンセルされます。簡単に言えば、トランザクションは「何もしないか、すべてを行うか」のメカニズムを提供します。

地方問題

ローカル トランザクションは、実際にはデータベースによって提供されるトランザクション メカニズムと考えることができます。データベース トランザクションに関しては、データベース トランザクションの 4 つの主要な特性について説明する必要があります。

A:原子性(Atomicity) : トランザクション内のすべての操作は、完了するか、完了しないかのいずれかです。

C:一致性(Consistency)トランザクションが実行される前と実行後に、データベースは一貫した状態になっている必要があります。

I:隔离性(Isolation) : 並行環境では、異なるトランザクションが同時に同じデータに対して操作を行う場合、トランザクションは互いに影響を及ぼしません。

D:持久性(Durability) 。トランザクションが正常に終了する限り、データベースへの更新は永続的に保存される必要があることを意味します。

データベース トランザクションを実装する場合、トランザクションに関係するすべての操作は、分割できない実行単位に含められます。実行ユニット内のすべての操作は成功するか失敗します。いずれかの操作が失敗した場合、トランザクション全体がロールバックされます。

分散トランザクション

分散トランザクションとは、トランザクション参加者、トランザクションをサポートするサーバー、リソース サーバー、およびトランザクション マネージャーが、異なる分散システムの異なるノードに配置されていることを意味します。

簡単に言えば、大規模な操作はさまざまな小規模な操作で構成されています。これらの小さな操作は異なるサーバーに分散され、異なるアプリケーションに属します。分散トランザクションでは、これらの小さな操作がすべて成功するか、すべて失敗するかを保証する必要があります。

本質的に、分散トランザクションは、異なるデータベース間でのデータの一貫性を確保するように設計されています。

分散トランザクションのシナリオ

  • 複数のデータベースにアクセスするモノリシックシステム

    サービスは、データの追加、削除、変更操作を完了するために複数のデータベースインスタンスを呼び出す必要があります。

  • 複数のマイクロサービスが同じデータベースにアクセスする

    データの追加、削除、変更操作を完了するには、複数のサービスがデータベースインスタンスを呼び出す必要があります。

  • 複数のマイクロサービスが複数のデータベースにアクセスする

    データの追加、削除、変更操作を完了するには、複数のサービスがデータベースインスタンスを呼び出す必要があります。

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

グローバル取引

グローバル トランザクションは DTP モデルに基づいて実装されます。 DTP は、X/Open 組織によって提案された分散トランザクション モデル ( X/Open Distributed Transaction Processing Reference Modelです。分散トランザクションを実装するには、次の 3 つの役割が必要であると規定されています。

  • AP: アプリケーションシステム(マイクロサービス)

  • TM: トランザクション マネージャ (グローバル トランザクション管理)

  • RM: リソース マネージャー リソース マネージャー (データベース)

取引全体は 2 つの段階に分かれています。

フェーズ 1: 投票フェーズでは、すべての参加者がトランザクションを事前送信し、それが成功するかどうかについてのフィードバックをコーディネーターに送信します。

フェーズ 2: 実行フェーズ。コーディネーターはフィードバックに基づいてすべての参加者に通知し、コミットまたはロールバックを同時に実行します。

アドバンテージ:

  • データの一貫性の確率を高め、実装コストを削減します

欠点:

  • 単一障害点: トランザクションコーディネーターのダウンタイム

  • 同期ブロッキング: 送信時間を遅らせ、リソースのブロッキング時間を延長します

  • データの不整合: 第2フェーズを送信するときに、コミット結果が不明な状況がまだ存在し、データの不整合につながる可能性があります。

信頼性の高いメッセージングサービス

信頼性の高いメッセージ サービスに基づくソリューションは、メッセージ ミドルウェアを通じて上流と下流のアプリケーション データ操作の一貫性を確保することです。

タスク A とタスク B をそれぞれ処理できる 2 つのシステム A と B があるとします。このとき、タスク A とタスク B を同じトランザクションで処理する必要があるビジネス プロセスが存在します。この分散トランザクションを実装するには、メッセージ ミドルウェアを使用できます。

ステップ1: メッセージはシステムAからミドルウェアに配信される

  1. システムAがタスクAを処理する前に、まずメッセージミドルウェアにメッセージを送信する。

  2. メッセージ ミドルウェアは、メッセージを受信した後、メッセージを保持しますが、配信は行いません。永続化が成功すると、確認応答がAに送信されます。

  3. システムAが確認応答を受信すると、タスクAの処理を開始できる。

  4. タスク A が処理された後、コミットまたはロールバック要求がメッセージ ミドルウェアに送信されます。リクエストが送信されると、システム A のトランザクション処理が完了します。

  5. メッセージ ミドルウェアが Commit を受信すると、メッセージをシステム B に配信します。ロールバックを受信した場合、メッセージを直接破棄します。ただし、メッセージ ミドルウェアがコミットおよびロールバックの指示を受信しない場合は、「タイムアウト クエリ メカニズム」に依存する必要があります。

タイムアウト照会メカニズムシステム A では、通常のビジネス プロセスを実装するだけでなく、メッセージ ミドルウェアが呼び出すトランザクション照会インターフェイスも提供する必要があります。メッセージ ミドルウェアはパブリッシュ メッセージを受信すると、タイミングを開始します。制限時間内に確認指示が受信されない場合は、システム A が提供するトランザクション クエリ インターフェイスを積極的に呼び出して、システムの現在の状態を照会します。このインターフェースは 3 つの結果を返し、ミドルウェアは 3 つの結果に基づいて異なる応答を行います。

  • 送信: メッセージをシステムBに配信する

  • ロールバック: メッセージを直接破棄する

  • 処理中: 待機を続行

ステップ2: メッセージはミドルウェアによってシステムBに配信される

メッセージ ミドルウェアはメッセージを下流のシステムに配信した後、ブロックされた待機状態になります。下流システムはタスクを直ちに処理し、タスクが処理された後、メッセージ ミドルウェアに応答を返します。

  • メッセージ ミドルウェアが確認応答を受信すると、トランザクションが完了したとみなされます。

  • メッセージ ミドルウェアが確認応答を待機中にタイムアウトした場合、下流のコンシューマーが正常な消費応答を返すまでメッセージを再配信します。

信頼性の高いメッセージング サービスに基づく分散トランザクションでは、前半はパフォーマンスを重視して非同期処理を使用します。後半は同期処理を中心に開発コストに注力します。

ベストエフォート通知

ベスト エフォート通知 (定期的な校正とも呼ばれる) は、2 番目のソリューションをさらに最適化したものです。エラー メッセージを記録するためのローカル メッセージ テーブルを導入し、失敗したメッセージの定期的な校正機能を追加して、メッセージが下流のシステムで確実に使用されるようにします。

ステップ1: メッセージはシステムAからミドルウェアに配信される

  1. 処理業務の同じトランザクションで、ローカルメッセージテーブルにレコードを書き込む

  2. 専用のメッセージ送信者を用意して、ローカル メッセージ テーブルからメッセージ ミドルウェアにメッセージを継続的に送信し、送信が失敗した場合は再試行します。

ステップ2: メッセージはミドルウェアによってシステムBに配信される

  1. メッセージ ミドルウェアは、メッセージを受信した後、対応する下流システムにメッセージを同期的に配信し、下流システムでタスクの実行をトリガーする役割を担います。

  2. 下流のシステムがメッセージを正常に処理すると、メッセージ ミドルウェアに確認応答が送信され、メッセージ ミドルウェアはメッセージを削除してトランザクションを完了できます。

  3. 配信に失敗したメッセージについては、再試行メカニズムを使用して再試行します。配信に失敗したメッセージについては、エラーメッセージテーブルを記述します。

  4. メッセージ ミドルウェアは、失敗したメッセージのクエリ インターフェイスを提供する必要があります。下流のシステムは定期的に失敗したメッセージを照会し、それらを消費します。

このアプローチの利点と欠点:

利点: 最終的な一貫性を実現する非常に古典的な実装。

デメリット: メッセージ テーブルはビジネス システムに結合されます。カプセル化されたソリューションがない場合、さまざまな雑多な作業が必要になります。

TCC業務

TCC は Try Confirm Cancel の略で、補償分散トランザクションです。 TCC は、分散トランザクションを次の 3 つのステップで実装します。

  • 試す: 実行するビジネスを試します。このプロセスはビジネスを実行するのではなく、すべてのビジネスの一貫性チェックを完了し、実行に必要なすべてのリソースを予約するだけです。

  • 確認: ビジネス チェックを実行せずにビジネス操作の実行を確認し、試行フェーズで予約されたビジネス リソースのみを使用します。

  • キャンセル: 保留中のビジネスと、試行フェーズで予約されたビジネス リソースをキャンセルします。

TCC 2 フェーズ コミットと XA 2 フェーズ コミットの違いは次のとおりです。

XA は、強力な一貫性を備えたリソース レベルの分散トランザクションです。 2 フェーズ コミット プロセス全体を通じて、リソース ロックは常に保持されます。

TCC は、最終的な一貫性を備えたビジネス レベルの分散トランザクションであり、常にリソース ロックを保持するわけではありません。

TCC 取引の利点と欠点:

アドバンテージ:

データベース層の 2 フェーズ コミットは実装のためにアプリケーション層に移動され、データベース層での 2PC パフォーマンスの低下の問題を回避します。

欠点:

TCC の Try、Confirm、Cancel 操作機能はビジネス側で提供する必要があり、開発コストが高くなります。

サガ

Saga は補償プロトコルです。 Saga モードでは、分散トランザクションに複数の参加者が存在します。各参加者はリバース補償サービスであり、ユーザーはビジネスシナリオに基づいてフォワード操作とリバースロールバック操作を実装する必要があります。

補償プロトコル: Saga モードでは、分散トランザクションに複数の参加者が存在し、各参加者は正の補償サービスです。上図において、 T1~Tn転送コールC1~Cn補償コールです。転送呼び出しと補償呼び出しの間には 1 対 1 の対応があります。

呼び出されるサービスが n 個あると仮定します。T1 T1サービス 1 への呼び出し、続いてT2はサービス 2 への呼び出し、T3 はサービス 3 への呼び出しです。この時点で失敗が返された場合は、ロールバックが必要です。このとき、 T2の対応する補償C2が呼び出され、 T1の対応する補償C1が呼び出されて、分散トランザクションが初期状態に戻ります。

Saga のポジティブ サービスと補償サービスはどちらもビジネス開発者によって実装される必要があるため、ビジネスに干渉します。 Saga モードの分散トランザクションは通常、イベント駆動型であり、参加者間で非同期的に実行されます。 Saga モードは、長いトランザクション ソリューションです。

Sagaパターンの使用シナリオ

Saga モードは、トランザクションの最終的な一貫性を保証する必要がある長いビジネス プロセスを持つビジネス システムに適しています。 Saga モードは、最初の段階でローカル トランザクションをコミットし、ロックフリーおよび長いプロセスでのパフォーマンスを保証できます。

トランザクションの参加者は、他社のサービスやレガシー システムである場合があります。これらは変換できず、TCC に必要なインターフェースを提供できません。 Sagaパターンが使用可能です。

サガパターンの長所と短所

利点:

ローカル データベース トランザクションの 1 フェーズ コミット、ロックフリー、高パフォーマンス。

参加者はトランザクション駆動型の非同期実行を使用できます。高スループット補償サービスは、フォワード サービスの「逆」であり、理解しやすく実装しやすいサービスです。

欠点:

Saga モードでは、ローカル データベース トランザクションが最初のフェーズでコミットされており、「予約」アクションが実行されていないため、分離は保証されません。

シータ

2019年1月、アリババのミドルウェアチームは、分散トランザクションの使用をローカルトランザクションと同じくらいシンプルかつ効率的にし、開発者が分散トランザクションで遭遇するすべての問題を徐々に解決するというビジョンを掲げ、オープンソースプロジェクトFescar(Fast & EaS​​y Commit And Rollback)を立ち上げました。その後、分散トランザクション ソリューションである、シンプルで拡張可能な自律トランザクション アーキテクチャを意味する Seata に名前が変更されました。

Seata の設計目標はビジネスに支障をきたさないことであり、そのため、まずは支障をきたさない 2PC ソリューションから始めて、従来の 2PC をベースに進化していきます。分散トランザクションを、複数のブランチ トランザクションを含むグローバル トランザクションとして認識します。グローバル トランザクションの責任は、管轄下にあるブランチ トランザクションを調整して合意に達し、一緒に正常に送信し、失敗した場合は一緒にロールバックすることです。さらに、ブランチ トランザクション自体は通常、リレーショナル データベースのローカル トランザクションです。

Seata は主に 3 つの重要なコンポーネントで構成されています。

TC: トランザクション コーディネーター。グローバル ブランチ トランザクションのステータスを管理し、グローバル トランザクションのコミットとロールバックに使用されます。

TM: トランザクション マネージャー。グローバル トランザクションを開始、コミット、またはロールバックするために使用されます。

RM: リソース マネージャー。ブランチ トランザクションのリソース管理、TC へのブランチ トランザクションの登録、ブランチ トランザクションのステータスの報告、および TC からのブランチ トランザクションのコミットまたはロールバック コマンドの受け入れに使用されます。

Seata の実行プロセスは次のとおりです。

  1. サービス A の TM は、TC にグローバル トランザクションを開くように要求します。次に、TC はグローバル トランザクションを作成し、一意の XID を返します。

  2. サービスAのRMは、TCにブランチトランザクションを登録し、XIDに対応するグローバルトランザクションの管轄に含める。

  3. サービスAはブランチトランザクションを実行し、データベースに対して操作を実行します。

  4. サービス A がリモートでサービス B の呼び出しを開始し、XID がマイクロサービス呼び出しチェーンに伝播します。

  5. サービス B の RM は、ブランチ トランザクションを TC に登録し、XID に対応するグローバル トランザクションの管轄下に置きます。

  6. サービスBはブランチトランザクションを実行し、データベースに対して操作を実行します。

  7. グローバル トランザクション呼び出しチェーンが処理された後、TM は例外があるかどうかに基づいて、TC へのグローバル トランザクションのコミットまたはロールバックを開始します。

  8. TCは管轄下にあるすべての支部業務を調整し、ロールバックするかどうかを決定します。

Seata の 2PC 実装と従来の 2PC の違い:

  1. アーキテクチャ レベルに関して言えば、従来の 2PC ソリューションの RM は実際にはデータベース層にあります。 RM は本質的には XA プロトコルを通じて実装されたデータベースそのものです。一方、Seata の RM は、jar パッケージの形式でミドルウェア レイヤーとしてアプリケーション側に展開されます。

  2. 2 フェーズ コミットに関して、従来の 2PC では、第 2 フェーズの解決がコミットかロールバックかに関係なく、フェーズ 2 が完了するまでトランザクション リソースのロックを保持する必要があります。 Seata のアプローチは、フェーズ 1 でローカル トランザクションをコミットすることで、フェーズ 2 でのロック時間を節約し、全体的な効率を向上させることです。

<<:  分散IDとは何かを理解するのに役立つ記事

>>:  クラウドコンピューティングの世界におけるデータアーキテクチャの再考

推薦する

成功と失敗は細部によって決まる。内部リンク構築において無視できない細部

検索エンジンがますますユーザーフレンドリーになるにつれて、サイトの内部構造に対する要件もますます高く...

ファーウェイは、世界で初めてクラウドネイティブコンピューティング財団(CNCF)認定のKubernetesサービスプロバイダーの1つになりました。

[中国、深セン、2017年9月18日] 先日ロサンゼルスで開催されたオープンソースサミットにおいて、...

Ganji.comとWowotuanの共同出口モデルは参考になるかもしれない

Ganji.comは共同購入事業をWoWotuanに売却したが、アナリストらはこれを「負担の解消」と...

凌橋クラウド 劉孟馨: Kubernetes ネットワーク改善に関する 3 つの実践的な共有

[51CTO.comより引用] 51CTO主催のWOTグローバルソフトウェアおよび運用技術サミットが...

JavaScript を使ってユーザーと検索エンジンを欺く 2 つのトリックを暴露

JS に関しては、検索エンジンに優しくないこの技術が、美しい Web ページ効果を生み出し、いくつか...

主流の人気のインターネット製品を活用して、自社製品の価値を探る

ほぼすべての伝統的な企業が「オンライン化」を開始しており、これは長い間の傾向です。その理由は単純です...

小紅書のアルゴリズムの欠陥は解決不可能

12月5日、CCTVニュースは、小紅書プラットフォームには未成年者向けの性的に挑発的なコンテンツが含...

全国的なキャンパスチャンネルの構築方法を理解するための1つの記事

モバイルインターネットの台頭により、キャンパス市場ではソーシャルネットワーキング、電子商取引、金融、...

SEO検索するとなぜチベタン・マスティフが表示されるのでしょうか? SEOとチベタン・マスティフの関係は何ですか?

今日、たまたまSEOを検索して、最新のSEOインデックスについて知りました。鄭州SEO老峰を驚かせた...

tmhhost: 388元/年、米国cn2gia/cu2(as9929)/日本ソフトバンク、4Gメモリ/2コア/40g SSD/1.5Tトラフィック/20g防御

tmhhostは現在、ロサンゼルスデータセンター、cn2 gia、cuii(as9929)、日本ソフ...

ロシアの VPS レビュー: melbicom、KVM 仮想化、無制限のトラフィック

昨日、私は「ロシアの VPS サーバー: melbicom、苦情反対、著作権無視、無制限のトラフィッ...

結局のところ、ウェブサイトに最適な外部リンクを作成する方法

サイトの SEO プロセス全体において、外部リンクが果たす役割を無視することはできません。筆者はかつ...

Bespin Global: AI技術を活用してクラウドネイティブのインテリジェントな運用・保守方法を構築

【51CTO.comオリジナル記事】序文最近、Bespin Globalの共同創設者であるブラッド・...

JD Retail Cloud mPaaS が先導し、銀行業界のデジタル変革とアップグレードを支援します。

近年、我が国の商業銀行はデジタル変革のペースを加速させています。一部の商業銀行は、デジタル化を銀行全...

GoogleはユーザーにGoogle+アカウントの登録を強制しなくなった

米国のテクノロジーニュースサイトEngadgetなどの報道によると、業界関係者は最近、Googleが...