分散トランザクションに関与する参加者は、非同期ネットワークに分散されます。参加者はネットワーク通信を通じて分散一貫性を実現します。ネットワーク通信では、必然的に障害やタイムアウトが発生しやすくなります。したがって、分散トランザクションの実装は、ローカル トランザクションよりも困難になります。この記事では、5 つの分散トランザクション ソリューションをまとめ、その特徴を分析します。かなり長いので、生徒は保存して後で読むことができます。 概要 トランザクションとは、すべて正常に実行されるか、すべてキャンセルされる、グループ化できない操作のセットです。取引を必要とする最も一般的なシナリオは、銀行口座間の振替です。口座 A が口座 B に 100 元を振り替える場合、口座 A は 100 元を減額し、口座 B は 100 元を増額する必要があります。両方のアカウントのデータ変更が成功した場合にのみ、転送は成功したとみなされます。より厳密に言えば、トランザクションは次の 4 つの ACID プロパティを使用して記述できます。
単一のデータベースではネットワークのやり取りが不要なので、複数のテーブル間でトランザクションを実装するのは比較的簡単です。このタイプのトランザクションをローカル トランザクションと呼びます。 ただし、単一のデータベースのパフォーマンスがボトルネックになると、データベース(物理インスタンス)に分割する必要があり、データベース(データベース インスタンス)間のトランザクション要件が発生します。エンタープライズアプリケーションの規模が拡大するにつれて、企業はビジネスの成長のニーズを満たすためにサービス指向の変革をさらに進めることになります。現在、マイクロサービス アーキテクチャはますます普及しており、サービス間のトランザクション シナリオも増加しています。 これらは分散トランザクションの要件です。分散トランザクションとは、トランザクションの開始者、参加者、データ リソース サーバー、およびトランザクション マネージャーが分散システムの異なるノードに配置されていることを意味します。 要約すると、分散トランザクションには 3 つのシナリオがあります。
分散トランザクションに関与する参加者は、非同期ネットワークに分散されます。参加者はネットワーク通信を通じて分散一貫性を実現します。ネットワーク通信では、必然的に障害やタイムアウトが発生しやすくなります。したがって、分散トランザクションの実装は、ローカル トランザクションよりも困難になります。以下に、いくつかの一般的な分散トランザクション ソリューションを示します。 分散トランザクションモード XA仕様 最も古い分散トランザクション製品は、1980 年代に AT&T が発売した Tuxedo (Transactions for Unix, Extended for Distributed Operations) でしょう。 Tuxedo はもともと、通信分野の OLTP システム向けに開発された分散トランザクション ミドルウェアでした。その後、標準化団体 X/Open は Tuxedo の設計アイデアといくつかのインターフェースを吸収して採用し、分散トランザクション仕様である XA 仕様を立ち上げました。 XA 仕様では、次の 4 つのコア ロールを含む分散トランザクション処理モデルが定義されています。
次の図は、XA 仕様で定義されているトランザクション モデルの図です。分散トランザクションを開始する TM インスタンスはルート ノードと呼ばれ、他の TM インスタンスは総称してトランザクション参加者と呼ばれます。トランザクション イニシエーターはグローバル トランザクション全体を開始する責任があり、各トランザクション参加者は独自のトランザクション ブランチを実行する責任があります。 TM インスタンスが別の TM インスタンスへのサービス呼び出しを開始する場合、開始側は上位ノードと呼ばれ、呼び出されたインスタンスは下位ノードと呼ばれます。 図の出典: 「分散トランザクション処理: 参照モデル、バージョン 3」32 ページ、図 3-2 XA 仕様では、分散トランザクションは RM ローカル トランザクション (この時点ではローカル トランザクションはブランチ トランザクションと見なされます) に基づいて構築され、TM はこれらのブランチ トランザクションが正常にコミットまたはロールバックされるように調整する役割を担います。 XA 仕様では、分散トランザクション処理プロセスを 2 つのフェーズに分割するため、2 フェーズ コミット プロトコル (2 フレーズ コミット) とも呼ばれます。 1) 準備段階 TM はトランザクション開始ログを記録し、各 RM にコミット準備操作を実行できるかどうかを問い合わせます。 RM は、指示を受け取った後、自身のステータスを評価し、リソースの予約、リソースのロック、操作の実行など、ローカル トランザクションの準備操作を実行しようとしますが、トランザクションをコミットせず、TM からの後続の指示を待機します。試行が失敗した場合、TM にはこのフェーズの実行が失敗したことが通知され、TM 自身の操作がロールバックされ、その後、TM はこのトランザクションに参加しなくなります (MySQL を例にとると、このフェーズではリソースのロックと、REDO ログおよび UNDO ログの書き込みが完了します)。 TM は RM の応答を収集し、トランザクション準備完了ログを記録します。 2) コミット/ロールバックフェーズ このフェーズでは、前のフェーズの調整結果に基づいて、トランザクションのコミットまたはロールバック操作を開始します。 前の手順ですべての RM が成功の結果を返した場合、次のようになります。
RM が実行失敗を返すか、前のステップで応答せずにタイムアウトした場合、TM はそれを実行失敗として処理します。それから:
一部のシナリオでは、XA 仕様で次の最適化手段も定義されています。
XA 仕様では、コア コンポーネント間の相互作用インターフェイスが詳細に定義されています。 TM と RM 間の相互作用インターフェースを例に挙げます。次の図に示すように、完全なグローバル トランザクションでは、TM と RM 間のやり取りは比較的頻繁に行われます。 トランザクションの実行中に、ダウンタイムやネットワーク タイムアウトが発生する可能性があります。このような異常なシナリオでは、XA 仕様の実装によって例外処理方法が異なる場合があります。参考までに以下をご参照ください。
機能分析 XA 2 フェーズ コミット プロトコルは、ローカル トランザクションのようなトランザクションの 4 つの ACID プロパティを実装するように設計されています。
XA は最も初期の分散トランザクション仕様です。 Oracle、MySQL、SQLServer などの主流のデータベースはすべて XA 仕様をサポートしています。 J2EE の JTA 仕様も XA 仕様を参照して記述されており、XA 仕様と互換性があります。 XA は、リソース管理レベルで実装される分散トランザクション モデルであり、ビジネスへの影響は低くなります。 XA 2 フェーズ コミット プロトコルは、分散トランザクションの 3 つのシナリオをカバーできます。ただし、グローバル トランザクションの実行中は、RM は常にリソースのロックを保持します。特にサービス間シナリオで RM が多すぎると、ネットワーク通信の数と時間が大幅に増加するため、ブロック時間が長くなり、システム スループットが非常に低下し、トランザクション デッドロックの可能性が高まります。したがって、マイクロサービス アーキテクチャ シナリオのクロスサービス分散トランザクション モードには適していません。 各 TM ドメインでは、TM が単一ポイントであるため、単一ポイント障害のリスクがあります。フェーズ 1 後に TM が失敗すると、参加している RM はフェーズ 2 からの要求を長時間受信できず、リソース ロックを長時間保持することになり、ビジネスのスループットに影響を及ぼします。同時に、完全なグローバル トランザクションには、TM と RM 間の最大 8 回のやり取りが含まれ、これは非常に煩雑であり、システムの処理パフォーマンスに大きな影響を与えます。 XA 2 フェーズ プロトコルにより、スプリット ブレイン例外が発生する可能性があります。フェーズ 2 で TM が RM にトランザクションをコミットするように通知し、命令が発行された後にシステムがクラッシュし、一部の RM のみがコミット要求を受信した場合、TM が回復したときに、このトランザクションのすべての RM ローカル トランザクションの一貫性を調整できなくなります。 XA は多くの例外シナリオを処理する必要があり、フレームワークの実装に一定の課題をもたらします。オープンソースの実装については、Atomikos、Bitronix を参照してください。 XA 2 フェーズ コミットの問題に対応して、改良された 3 フェーズ コミット ソリューションが提案されました。 3 フェーズ コミット ソリューションは、主に単一点障害の問題を解決し、リソースの長期ロックを回避するために RM 側にタイムアウト メカニズムを導入します。しかし、3 段階の送信方式では、スプリット ブレインという異常な状況を回避することはできません。実際の適用事例は少ない。興味のある学生は自分で関連情報を見つけることができます。 TCC TCC (Try、Commit、Cancel) は補償トランザクションです。このモデルでは、アプリケーションの各サービスが、試行、確認、キャンセルの 3 つのインターフェースを提供する必要があります。その中心的な考え方は、リソースを予約する(中間状態を提供する)ことによって、リソースのロックをできるだけ早く解除することです。トランザクションをコミットできる場合、予約されたリソースが確認されます。トランザクションをロールバックする必要がある場合、予約されたリソースは解放されます。 TCC も 2 フェーズ コミット プロトコルであり、2PC/XA のバリエーションとして考えることができますが、リソース ロックを長時間保持しません。 TCC モデルでは、トランザクションの送信を 2 つのフェーズに分割します。 1) フェーズ1 ビジネス チェック (一貫性) を完了し、ビジネス リソース (準分離) を予約します。これが TCC での試みです。 2) フェーズ2 試行フェーズですべてのビジネス リソースが正常に予約された場合は、確認操作が実行され、それ以外の場合はキャンセル操作が実行されます。
TCC モードでは、トランザクションの開始者と参加者の両方がトランザクション ログを記録する必要があります。トランザクションの開始者は、グローバル トランザクションと各ブランチ トランザクションのステータスと情報を記録する必要があります。取引の参加者は、ブランチ取引のステータスを記録する必要があります。 TCC トランザクションの実行中、どの段階でもダウンタイム、再起動、ネットワーク中断などの異常な状況が発生する可能性があります。この時点で、トランザクションは非アトミック状態であり、最終的に一貫性のない状態です。このとき、メイントランザクション記録とブランチトランザクション記録のログに基づいて、残りのブランチトランザクションの送信またはロールバックを完了し、分散トランザクション全体のすべての参加者が最終的な一貫性のある状態に到達し、トランザクションのアトミック性を実現する必要があります。 例 単純な電子商取引システムを例に挙げてみましょう。シャオミンさんはタオバオで100元を使って本を購入し、10ポイントを獲得した。製品にはいくつかの操作があります: 注文システムは製品注文を作成する 決済システムはシャオミンの支払いを受け入れる 在庫管理システムは製品在庫を減算します 会員システムはシャオミンのアカウントに会員ポイントを追加します これらのアクションはトランザクションとして実行する必要があり、同時に成功するかキャンセルされる必要があります。 TCC トランザクション モードを使用する場合、各システムを次の状態に変換する必要があります。 1) 注文システム
2) 支払いシステム
3) 在庫システム
4) 会員制度
機能分析 TCC トランザクションには、次の 4 つのトランザクション特性があります。
TCC トランザクション モデルはビジネス側への影響が非常に大きく、ビジネス側で機能の実装を 1 つのインターフェイスから 3 つに分割する必要があり、その結果、開発コストが高くなります。 同時に、非同期ネットワークでの通信障害やタイムアウトによって発生する異常な状況を解決するために、TCC トランザクションでは、ビジネス側が設計と実装において次の 3 つの戦略に従う必要があります。
TCC トランザクションは、分散トランザクションをリソース レイヤーからビジネス レイヤーに移動するため、ビジネスはリソース ロックの粒度を柔軟に選択でき、グローバル トランザクションの実行中はロックが常に保持されるわけではないため、システム スループットは 2PC/XA モードよりもはるかに高くなります。 TCC トランザクションをサポートするオープン ソース フレームワークは、ByteTCC、Himly、および TCC-transaction です。 佐賀 佐賀は新しい概念ではありません。関連する論文は 1987 年に公開されました。これは、XA 2 フェーズ コミット仕様とほぼ同じ時期です。 Saga は TCC と同様に補償トランザクションですが、試行フェーズはありません。代わりに、分散トランザクションを、一連のローカル トランザクションで構成されるトランザクション チェーンとして扱います。 トランザクション チェーン内の各フォワード トランザクション操作は、可逆トランザクション操作に対応します。 Saga トランザクション コーディネーターは、トランザクション チェーン内のブランチ トランザクションを順番に実行する役割を担います。ブランチ トランザクションが実行されると、リソースが解放されます。ブランチ トランザクションが失敗した場合、トランザクション補正操作が反対方向に実行されます。 Saga の分散トランザクション チェーンが n 個のブランチ トランザクション [T1、T2、...、Tn] で構成されている場合、分散トランザクションには 3 つの実行シナリオがあります。
例 シャオミンが国慶節の連休中に遊びに出かけたい場合、北京から出発して、まずロンドンに行き、ロンドンで3日間遊び、その後パリに行き、パリで3日間遊び、その後北京に戻ることができます。旅行全体には、さまざまな航空会社の航空券の予約と、ロンドンとパリの現地ホテルの予約が含まれます。シャオミンさんは、チケットやホテルが手に入らなければ旅行をキャンセルするつもりだ。総合旅行サービスプラットフォームがこのワンクリック注文機能を提供する場合、これは長い取引になります。 Saga モデルを使用してサービスがオーケストレーションされる場合、次の図のようになります。いずれかのリンクに障害が発生すると、補償操作によって以前の旅程予約がキャンセルされます。 機能分析 Saga トランザクションは、トランザクションの次の 3 つの特性を保証できます。
ただし、Saga はトランザクションの分離を保証しません。ローカル トランザクションがコミットされると、変更は他のトランザクションにも表示されます。正常に送信されたデータが他のトランザクションによって変更された場合、補正操作は失敗する可能性があります。たとえば、控除が失敗したが、お金がすでに使われてしまった場合、ビジネス設計ではこのシナリオを考慮してこの問題を回避する必要があります。 Saga トランザクションは、TCC トランザクションと同様に、ビジネス実装に対する要件が高く、次の 3 つの戦略に従うビジネス設計と実装が必要です。
Saga と TCC はどちらも補償トランザクションですが、送信フェーズが異なるため異なります。
Saga モードは、長いビジネス プロセスと長いトランザクションを含むシナリオに非常に適しています。その実装はビジネスへの影響が少ないため、マイクロサービス アーキテクチャのシナリオに非常に適しています。同時に、Saga は 1 フェーズ コミット モードを採用しており、リソースを長時間ロックせず、「バレル効果」も発生しないため、このモード アーキテクチャを使用するシステムは高性能で高スループットを実現します。 Alibaba の Seata オープンソース プロジェクトと Huawei の ServiceComb オープンソース プロジェクトはどちらも Saga モデルをサポートしています。 メッセージベースの分散トランザクション メッセージベースの分散トランザクション モデルの中心的な考え方は、メッセージ システムを通じて他のトランザクション参加者に自身のトランザクションの実行ステータスを通知することです。 メッセージング システムの導入により、トランザクション参加者がより効果的に分離され、各参加者が非同期で実行できるようになります。 このモードの難しさは、ローカル トランザクションの実行とメッセージ送信の一貫性を解決することにあります。つまり、両方を同時に正常に実行するか、キャンセルする必要があります。 これを実現するには主に 2 つの方法があります。
トランザクションメッセージに基づく分散トランザクション 通常のメッセージでは、ローカル トランザクションの実行とメッセージ送信の一貫性の問題を解決できません。メッセージ送信はネットワーク通信プロセスであるため、メッセージ送信プロセスが失敗したり、タイムアウトしたりする可能性があります。タイムアウト後、メッセージは正常に送信されるか、失敗する可能性があります。メッセージの送信者を特定できないため、送信者がトランザクションをコミットするかロールバックするかによって不整合が発生する可能性があります。 この問題を解決するには、トランザクション メッセージを導入する必要があります。トランザクション メッセージと通常のメッセージの違いは、トランザクション メッセージが正常に送信された後、準備済み状態になり、サブスクライバーが使用できないことです。ダウンストリーム サブスクライバーは、トランザクション メッセージの状態が消費可能状態に変更された後にのみメッセージを監視できます。 ローカルトランザクションとトランザクションメッセージ送信の処理フローは次のとおりです。
ローカルメッセージに基づく分散トランザクション トランザクション メッセージング モデルには、MQ システムに対する高い要件があります。すべての MQ システムがトランザクション メッセージングをサポートしているわけではありません。 RocketMQ は、現在トランザクション メッセージングをサポートしている数少ない MQ システムの 1 つです。依存する MQ システムがトランザクション メッセージをサポートしていない場合は、ローカル メッセージの分散モードを使用できます。 このモードの中心的な考え方は、トランザクションのイニシエーターがローカル メッセージ テーブルを維持し、ビジネスの実行とローカル メッセージ テーブルの実行が同じローカル トランザクション内にあることです。業務が正常に実行された場合、「送信保留中」状態のメッセージがローカル メッセージ テーブルに記録されます。システム内でスケジュールされたタスクが開始され、ローカル メッセージ テーブル内のステータスが「送信予定」のレコードが定期的にスキャンされ、MQ システムに送信されます。送信が失敗したりタイムアウトになったりした場合は、送信が成功するまで送信が継続され、その後、ローカル メッセージ テーブルからレコードが削除されます。その後の消費およびサブスクリプションのプロセスは、トランザクション メッセージ ベースのモデルと同様です。 機能分析 メッセージベースの分散トランザクション モードは、次の ACID 機能をサポートします。
メッセージベースの分散トランザクションは、分散システムをより効果的に分離することができ、トランザクション参加者間の呼び出しは同期呼び出しではなくなります。 MQ システムに対する要件は高く、ビジネスの実装にも多少影響を及ぼします。トランザクション メッセージ ステータス クエリ インターフェイスが提供される、またはローカル メッセージ テーブルを維持する必要があります。原則として、下流ブランチトランザクションの成功のみを受け入れ、トランザクションのロールバックは受け入れません。トランザクションが失敗した場合は、継続的に再試行する必要があります。企業間のシステム間の呼び出しなど、最終的な一貫性がそれほど重要でないビジネス シナリオに適しており、適用可能なシナリオは限られています。 ベストエフォート通知分散トランザクション ベストエフォート通知タイプの分散トランザクション ソリューションも MQ システムに基づくソリューションですが、MQ メッセージの信頼性は必要ありません。 例 Xiao Ming が China Unicom のオンライン ビジネス ホールを通じて携帯電話料金をトップ チャージし、チャージ方法として Alipay を選択したとします。全体の操作プロセスは次のとおりです。
機能分析 ベスト エフォート通知ソリューションの本質は、定期的な検証メカニズムを導入することで最終的な一貫性を保証することです。ビジネスへの介入が少なく、MQ システムに対する要件も低く、実装も比較的簡単です。これは、プラットフォームや企業間のシステム間のビジネス相互作用など、最終的な一貫性と短いビジネス リンクに対する感度が低いシナリオに適しています。 分散トランザクションミドルウェア Alibaba には、2 つの分散トランザクション ミドルウェア オプションがあります。
XTS と TXC は同様の機能を持っています。どちらも TCC トランザクション モードをサポートし、ビジネスへの侵入が少ない分散トランザクション ソリューションを提供します。現在、これら 2 つのチームは、分散トランザクション ミドルウェア Seata のオープン ソース バージョンを共同で構築する予定です。ここでは、Seata を紹介します。 シータ ここで、Seata (Simple Extensible Autonomous Transaction Architecture) の歴史について簡単に説明します。
Seata は TCC モードと Saga モードをサポートしています。ただし、Seata の TCC モードのサポートにより、AT (自動トランザクション) モードと呼ばれる、ビジネスへの介入がゼロのソリューションが提供されます。次に、ATモードの動作メカニズムに焦点を当てます。
ATモードは、ロールバックログを自動的に生成し、ビジネスアクセスのコストとビジネス侵入の程度を削減します。ただし、ATモードの適用にはいくつかの制限があります。
要約する モノリシックデータベーストランザクションは、トランザクションの4つの酸性特性を簡単に満たし、強力な一貫性保証を提供できますが、分散トランザクションが酸性特性に完全に準拠することがより困難です。分散システムの高可用性と高スループットを追求するために、分散トランザクションソリューションは一般に最終的な一貫性を提供します。 強力な一貫性の剛性トランザクションを提供するトランザクションと、最終的な一貫性の柔軟なトランザクションを提供するトランザクションを呼び出します。剛性トランザクションは、4つの酸特性を完全に満たすことができます。柔軟なトランザクションは、次のようにトランザクションの酸特性をサポートしています。
通常、柔軟なトランザクションは、分散フィールドの基本理論に従います。
基本理論はCAP理論の拡張であり、CAPの一貫性と可用性のトレードオフの結果です。理論の核となるアイデアは、強い一貫性を達成することはできませんが、各アプリケーションは適切な方法を採用して、システムが独自のビジネス特性に基づいて最終的な一貫性を達成できるようにすることができます。 CAP理論は、分散システムが一貫性、可用性、パーティション許容度を同時に満たすことができないため、デザインのこれら3つのポイントの中でトレードオフが行われることを示しています。厳格なトランザクションは強い一貫性を追求するため、高可用性を犠牲にします。柔軟なトランザクションは、システムの高可用性と引き換えに一貫性を犠牲にします。 システムが分散ソリューションを選択すると、一貫性要件に基づいて選択できます。ビジネスに強い一貫性要件がある場合、XA仕様の2フェーズのコミットを優先します。ビジネスに最終的な一貫性のみが必要な場合、特定のシナリオに基づいた柔軟なトランザクションソリューションから選択できます。 参照する [1]分散トランザクションミドルウェアTXC(http://mw.alibaba-inc.com/product-txc.html) [2]弾性設計における補償問題(https://www.jiansshu.com/p/8095001d79bb) [3]分散トランザクションミドルウェアServiceComb (http://servicecomb.apache.org/cn/docs/distributed-transactions-saga-implementation/) [4] 2フェーズコミットの詳細な理解(https://sq.163yun.com/blog/article/165554812476866560)[5] seata(https://seata.io/zh-cn/) [6] TCCトランザクションの原則 (https://www.cnblogs.com/jajian/p/10014145.html) [7] TCCトランザクションの例外シナリオ(https://blog.csdn.net/dm_vincent/article/details/92432059 [8]トランザクションパターンの補償 (https://docs.microsoft.com/en-us/azure/architecture/patterns/compensating-transaction) [9]メッセージベースの分散トランザクション(https://www.jianshu.com/p/04bad986a4a2) [10]分散トランザクションの概要(http://www.tianshouzhi.com/api/tutorials/distributed_transaction/383) [11]最初にOpen/X XAを見てください (https://www.jiansshu.com/p/6c1fd2420274) [12] DTP:XA仕様 (https://pubs.opengroup.org/onlinepubs/009680699/toc.pdf) [13] DTPモデル (https://pubs.opengroup.org/onlinepubs/009249599/toc.pdf) 【この記事は51CTOコラムニスト「アリババオフィシャルテクノロジー」によるオリジナル記事です。転載については原著者にお問い合わせください。 この著者の他の記事を読むにはここをクリックしてください |
<<: クラウドサービスは新しいインフラの「魂」となり、大手クラウドサービスプロバイダー間の競争が激化している。
>>: クラウド コンピューティングで Python プログラミング言語が使用されるのはなぜですか?
近年、生活水準の向上に伴い、健康に関する話題がますます注目を集めており、人々の健康意識は絶えず高まっ...
[[234487]]まず、定義についての私の理解を述べさせてください。分散システムとは、ネットワーク...
Racknerd の第 2 回クリスマス プロモーション フラッシュ セールが始まりました。ロサンゼ...
360 Search が突如登場してから約 1 か月が経ちました。360 Search が最初にリリ...
ウェブマスターのウェブサイトでは、至る所で SEO 担当者がウェブサイトの記事の最適化について話して...
運用をクラウドに移行することは、IT とビジネスの俊敏性を高めるための課題であることは広く認められて...
SEO 実践者は皆、2 つのことを繰り返しています。1 つ目は、Web サイトと記事を更新することで...
raksmart データセンターの「ベアメタルクラウド」は、英語で「Bare-Metal Cloud...
アイスランドのホスティングプロバイダー flokinet.is (~) は現在、7 月 31 日まで...
bgp.to の日本サーバーは、東京と大阪の 2 つのデータセンターにあります。異なるデータセンター...
[51CTO.com クイック翻訳] マイクロソフトは先週、Azure Stack HCI のリリー...
エッジ コンピューティングは、型破りで最先端の考え方として、テクノロジーの時代精神の中で地位を確立し...
可能な限り短い時間と最小限の労力で、可能な限り多くの作業を完了することが、現代の開発の基本的な特徴で...
多くの Web サイトでは、ホームページへのリンクとして http://www.yourdomain...
このクラウド コンピューティング ガイドでは、クラウド コンピューティングの歴史、機能、利点、欠点、...