[51CTO.com からのオリジナル記事]ビジネスの急速な発展とビジネスの複雑性の増大に伴い、ほぼすべての企業のシステムはモノリシック システムから分散システム、特にマイクロサービス アーキテクチャへと移行します。
画像はBaotu.comより すると、必然的に分散トランザクションの問題に直面することになります。この記事は分散トランザクションの解決策をまとめたものであり、皆様のお役に立てば幸いです。 分散トランザクションの基礎①取引とは具体的に何ですか?トランザクションとは何ですか?実際の例を見てみましょう。食料品店に何かを買うとき、「お金を渡し、商品を渡す」ことが取引の一例です。取引が成功したとみなされるには、支払いと配送の両方が成功する必要があります。いずれかのアクティビティが失敗した場合、トランザクションは成功したすべてのアクティビティをキャンセルします。 上記の例を理解した後、トランザクションの定義を見てみましょう。トランザクションは、さまざまな小さなアクティビティで構成される大きなアクティビティと見なすことができ、これらのアクティビティはすべて成功するか、すべて失敗します。 ②まずは地元の情勢を振り返ってみましょうコンピュータ システムでは、トランザクションはリレーショナル データベースを通じて制御されることが多く、これはデータベース自体のトランザクション特性を利用して実現されるため、データベース トランザクションと呼ばれます。 アプリケーションは主にリレーショナル データベースに依存してトランザクションを制御し、データベースは通常アプリケーションと同じサーバー上にあるため、リレーショナル データベースに基づくトランザクションはローカル トランザクションとも呼ばれます。 データベース トランザクションの 4 つの主要な特性、ACID を確認しましょう。
例: 張三は李思に100元を送金します。転送前後のデータが正確であることを一貫性と呼びます。張三が100元を送金しても李思の口座残高が100元増加しない場合は、データエラーであり、一貫性が達成されません。
データベース トランザクションを実装する場合、トランザクションに関係するすべての操作は、分割できない実行単位に含められます。実行ユニット内のすべての操作は成功するか失敗します。いずれかの操作が失敗した場合、トランザクション全体がロールバックされます。 ③分散トランザクション銀行間送金業務は、典型的な分散型トランザクションのシナリオです。 A が銀行間で B に送金する必要がある場合、2 つの銀行のデータが関係します。転送の ACID は、データベースのローカル トランザクションでは保証できず、分散トランザクションを通じてのみ解決できます。 分散トランザクションとは、トランザクション イニシエーター、リソースとリソース マネージャー、およびトランザクション コーディネーターが分散システムの異なるノードに配置されていることを意味します。 上記の転送業務では、ユーザーA-100操作とユーザーB+100操作は同一ノード上に存在しません。 本質的に、分散トランザクションは、分散シナリオでデータ操作が正しく実行されるように設計されています。 分散環境では、分散トランザクションは、可用性、パフォーマンス、および劣化したサービスのニーズを満たすために、一貫性と分離性の要件を軽減し、一方では BASE 理論に従います (BASE 関連の理論には多くの内容が含まれており、興味のあるプログラマーは BASE 理論を参照できます)。 BASE理論:
同様に、分散トランザクションも ACID 仕様に部分的に準拠しています。
④分散トランザクションシナリオ典型的なシナリオはマイクロサービス アーキテクチャです。マイクロサービスはリモート呼び出しを通じてトランザクション操作を完了します。 たとえば、注文マイクロサービスと在庫マイクロサービスの場合、注文を行うと、注文マイクロサービスは在庫マイクロサービスに在庫を減らすように要求します。つまり、JVM プロセス全体に分散トランザクションを生成します。 モノリシック システムが複数のデータベース インスタンスにアクセスする: モノリシック システムが複数のデータベース (インスタンス) にアクセスする必要がある場合、分散トランザクションが発生します。 たとえば、ユーザー情報と注文情報はそれぞれ 2 つの MySQL インスタンスに保存されます。ユーザー管理システムがユーザー情報を削除する場合、ユーザー情報とユーザーの注文情報を別々に削除する必要があります。データが異なるデータ インスタンスに分散されているため、異なるデータベース リンクを介してデータを操作する必要があり、分散トランザクションが生成されます。 つまり、データベース インスタンス間で分散トランザクションを生成します。 複数のサービスが同じデータベース インスタンスにアクセスする: たとえば、注文マイクロサービスと在庫マイクロサービスが同じデータベースにアクセスする場合でも、分散トランザクションが生成されます。その理由は、JVM プロセス全体で、2 つのマイクロサービスが異なるデータベース リンクを保持してデータベース操作を実行し、分散トランザクションを生成するためです。 分散トランザクションソリューション①2PC(2相コミット)/XA2PC (2 フェーズ コミット プロトコル)、中国語では 2 フェーズ コミットと呼ばれます。 2 フェーズ コミットは強力な一貫性設計です。 2PC は、各参加者 (各ローカル リソースとも呼ばれます) のコミットとロールバックを調整および管理するトランザクション コーディネーターの役割を導入します。 2 つのフェーズは、準備 (投票) フェーズと提出フェーズを指します。 XA は、X/Open 組織によって提案された分散トランザクション仕様です。 XA 仕様は主に、(グローバル) トランザクション マネージャー (TM) と (ローカル) リソース マネージャー (RM) 間のインターフェイスを定義します。 MySQL などのローカル データベースは、XA では RM の役割を果たします。 XA は 2 つの段階に分かれています。
現在、MySQL、Oracle、SQL Server、Postgre など、ほとんどの主流データベースは XA トランザクションをサポートしています。 XA トランザクションは、1 つ以上のリソース マネージャー (RM)、トランザクション マネージャー (TM)、およびアプリケーション (ApplicationProgram) で構成されます。 準備に失敗した参加者がいる場合、TM は準備を完了したすべての参加者にロールバックを通知します。 XA トランザクションの特徴は次のとおりです。
②3相コミット(3PC)3 フェーズ コミット (3PC とも呼ばれます) は、2PC に CanCommit フェーズとタイムアウト メカニズムを追加します。 一定期間内にコーディネータからコミット要求を受信しなかった場合、コミットは自動的に実行され、2PC の単一点障害の問題が解決されます。しかし、パフォーマンスと不整合の問題は根本的に解決されていません。 3段階のプロセスがどのようなものか見てみましょう。 フェーズ 1: CanCommit フェーズ。このフェーズで行われる作業は非常に単純です。コーディネーターは、トランザクションの参加者にトランザクションを完了できるかどうかを尋ねます。 両方とも「はい」と返された場合は、第 2 段階に進みます。いずれかの参加者が「いいえ」を返すか、応答の待機時間がタイムアウトすると、トランザクションは中止され、すべての参加者に中止要求が送信されます。 フェーズ 2: PreCommit フェーズ。この時点で、コーディネーターはすべての参加者に PreCommit リクエストを送信します。参加者はそれを受け取った後、トランザクション操作の実行を開始し、元に戻すおよびやり直しの情報をトランザクション ログに記録します。 参加者がトランザクション操作を完了すると(この時点ではトランザクションはコミットされていない状態です)、コミットする準備ができたことを示すためにコーディネータに「Ack」をフィードバックし、コーディネータの次の指示を待ちます。 フェーズ 3: DoCommit フェーズ。フェーズ 2 では、すべての参加ノードが PreCommit 送信を実行できる場合、コーディネーターは「事前コミット状態」から「コミット状態」に変更されます。 次に、「doCommit」リクエストがすべての参加ノードに送信されます。コミット要求を受信すると、参加ノードはそれぞれトランザクションのコミット操作を実行し、コーディネーター ノードに「Ack」メッセージをフィードバックします。コーディネーターは、すべての参加者から Ack メッセージを受信した後、トランザクションを完了します。 逆に、参加ノードの 1 つが PreCommit フィードバックを完了できなかったり、フィードバックがタイムアウトになったりすると、コーディネーターはすべての参加ノードに中止要求を送信し、トランザクションを中断します。 ③サガSaga は、このデータベース ペーパー saga で言及されているソリューションです。基本的な考え方は、長いトランザクションを複数のローカルの短いトランザクションに分割し、それらを Saga トランザクション コーディネータが調整することです。正常に終了した場合は正常に完了します。ステップが失敗した場合、補正操作が逆の順序で 1 回呼び出されます。 上記の転送を例にとると、正常に完了した SAGA トランザクションのシーケンス図は次のようになります。 SAGA トランザクションの特徴:
④TCC2PC はデータベース レベルですが、TCC はビジネス レベルの分散トランザクションです。前にも述べたように、分散トランザクションにはデータベース操作だけでなく、テキスト メッセージの送信なども含まれます。ここで TCC が役立ちます。 TCC の 3 つのフェーズ:
上記の送金を例にとると、通常、金額は Try では凍結されますが差し引かれず、Confirm では差し引かれ、Cancel では凍結解除されます。 正常に完了した TCC トランザクションのタイミング図は次のとおりです。 TCC の機能は次のとおりです。
⑤ローカルメッセージテーブルローカル メッセージ テーブルは、実際には各システムのローカル トランザクションを使用して分散トランザクションを実装します。 名前が示すように、ローカル メッセージ テーブルはローカル メッセージを格納するためのテーブルです。通常はデータベースに配置されます。業務を実行する場合、業務の実行とメッセージをメッセージテーブルに入れる操作を同じトランザクション内に配置します。これにより、メッセージがローカル テーブルに格納されたときにビジネスが正常に実行されることが保証されます。 次に次の操作を呼び出します。次の操作呼び出しが成功した場合、メッセージ テーブルのメッセージ ステータスを直接成功に変更できます。 通話が失敗しても大丈夫です。バックグラウンド タスクは、定期的にローカル メッセージ テーブルを読み取り、成功しなかったメッセージをフィルター処理して、対応するサービスを呼び出します。サービス更新が成功すると、メッセージのステータスが変更されます。 このとき、メッセージに対応する操作が成功しない可能性があるため、再試行も必要です。再試行するには、対応するサービス メソッドがべき等であることを確認する必要があります。さらに、通常、再試行回数には上限があります。最大数を超えた場合は、手動で処理するためにアラームを記録することができます。 ローカル メッセージ テーブルは実際に最終的な一貫性を実現し、一時的なデータの不整合を許容していることがわかります。 ⑥メッセージ業務RocketMQ はメッセージ トランザクションを非常に適切にサポートします。メッセージを通じてトランザクションを実装する方法を見てみましょう。 最初のステップは、トランザクション メッセージ、または半分のメッセージをブローカーに送信することです。半分のメッセージとは、メッセージが半分であるという意味ではなく、メッセージが消費者に見えないという意味です。メッセージが正常に送信された後、送信者はローカル トランザクションを実行します。次に、ローカル トランザクションの結果に基づいて、ブローカーに Commit または RollBack コマンドを送信します。 さらに、RocketMQ の送信者は、逆クエリトランザクションステータスインターフェイスを提供します。セミメッセージが一定期間内に操作要求を受信しない場合、ブローカーはリバース クエリ インターフェイスを使用して送信者のトランザクションが正常に実行されたかどうかを確認し、Commit コマンドまたは RollBack コマンドを実行します。 コミットの場合、サブスクライバーはメッセージを受信してから、対応する操作を実行します。完了後、サブスクライバーはメッセージを消費できます。 RollBack の場合、サブスクライバーはメッセージを受信せず、トランザクションが実行されていないことを意味します。 RocketMQ を使用すると比較的簡単に実装できることがわかります。 RocketMQ はトランザクション メッセージの機能を提供します。トランザクション逆クエリ インターフェイスを定義するだけで済みます。 同時に、メッセージ トランザクションでも最終的な一貫性が実現されていることもわかります。 ⑦ベストエフォート通知通知の発信者は、特定のメカニズムを使用して、ビジネス処理の結果を受信者に通知するために最大限の努力を払います。 具体的には以下が含まれます:
先ほど紹介したローカル メッセージ テーブルとメッセージ トランザクションは、どちらも信頼できるメッセージです。ここで紹介したベストエフォート通知とどう違うのでしょうか? 信頼性の高いメッセージの一貫性: 通知を開始する側は、メッセージが送信され、通知を受信する側に確実に送信されるようにする必要があります。メッセージの信頼性は主に通知を開始する側によって保証されます。 ベスト エフォート通知: 通知の発信者は、通知の受信者にビジネス処理の結果を通知するために最善の努力を払いますが、メッセージが受信されない可能性があります。この場合、通知の受信者は、ビジネス処理の結果を照会するために、イニシエーターのインターフェースを積極的に呼び出す必要があります。通知の信頼性は通知の受信者によって異なります。 解決策としては、ベストエフォート通知には以下が必要です。
ベスト エフォート通知は、ビジネス通知タイプに適用されます。たとえば、WeChat トランザクションの結果は、コールバック通知やトランザクション クエリ インターフェイスを含むベスト エフォート通知を通じて各販売者に通知されます。 ⑧AT取引モードこれは、Alibaba のオープンソース プロジェクト Seata のトランザクション モードであり、Ant Financial では FMT とも呼ばれます。利点は、トランザクション モードが XA モードと同様に使用されることです。企業はさまざまな補償操作を記述する必要はなく、ロールバックはフレームワークによって自動的に完了します。欠点も AT と同様で、ロック時間が長く、高同時実行シナリオを満たしません。 Seata プロジェクトでは、Alibaba ミドルウェアによって初めてオープンソース化された AT モード (自動トランザクション) は、革新的でビジネスに影響を与えない分散トランザクション ソリューションです。 Seata の GA バージョンのリリース以降、AT モードはオープンソース コミュニティで広く注目を集めており、多くの企業ユーザーが Seata の AT モードを本番環境に適用しています。 AT モード ステージ 1: まず、Seata のコンポーネントで分散トランザクションを有効にする場合は、ビジネス エントリまたはトランザクション開始エントリに @GlobalTransactional アノテーションを追加する必要があります。 AT モードの場合は、データ ソース プロキシ (seata1.0 以降では自動プロキシが完全にサポートされています) を設定し、それを sqlsessionfactroy で使用する必要があります (または、プロキシされたデータ ソースを直接の JDBC 操作に使用します)。 重要な非同期性はプロキシ データ ソースであり、他のモードとは異なることがわかります。プロキシ データ ソースの秘密は何ですか? AT モードの 2 フェーズ コミット: 2 番目のフェーズがコミットされると、最初のフェーズで「ビジネス SQL」がデータベースに送信されているため、Seata フレームワークは、最初のフェーズで保存されたスナップショット データと行ロックを削除するだけで、データのクリーンアップを完了できます。 AT モード 2 段階ロールバック: 2 段階目をロールバックする場合、Seata は 1 段階目で実行した「業務 SQL」をロールバックし、業務データを復元する必要があります。 ロールバック方式は、「以前のイメージ」を使用してビジネス データを復元することです。ただし、復元する前に、まずダーティ ライトを検証し、「データベースの現在のビジネス データ」と「後のイメージ」を比較する必要があります。 2 つのデータ コピーが完全に一致している場合は、ダーティ ライトがなく、ビジネス データを復元できることを意味します。矛盾がある場合は、ダーティ ライトが発生しており、ダーティ ライトを手動で処理する必要があることを意味します。 まとめこの記事では、分散トランザクションの基本的な理論をいくつか紹介し、一般的に使用される分散トランザクション ソリューションについて説明します。 分散トランザクションはそれ自体が技術的な課題であり、ビジネスで使用する特定のソリューションは、さまざまなビジネス特性に応じて選択する必要があります。 しかし、分散トランザクションによってプロセスの複雑さが大幅に増加し、余分なオーバーヘッド作業が大量に発生することもわかりました。 「コード量が増え、業務が複雑化し、パフォーマンスが低下しました。」 したがって、実際に開発する際には、可能であれば分散トランザクションを使用しないようにする必要があります。 著者: JackHu 紹介:水地健康インフラの上級技術専門家 編集者:タオ・ジアロン 論文募集: 論文の提出や掲載を希望する技術者の方は [email protected] までご連絡ください。 [51CTO オリジナル記事、パートナーサイトに転載する場合は、元の著者とソースを 51CTO.com として明記してください] |
<<: チェックポイント: クラウドネイティブセキュリティの 5 つの主要な課題を分析
>>: 2022年以降の世界のIT業界に関するトップ10の予測
wow technology 傘下の VPS ブランドである virpus のクリスマス プロモーシ...
数日前、dedioneは1Gbps帯域幅、無制限トラフィック、CN2 GIAネットワークを備えた2つ...
偶然、SEO業界に加わりました。しばらく勉強した後、SEO についてある程度理解するようになりました...
実は、SEOerの育成や将来という話題は、多くの人から言及されています。私が今日このような話題を繰り...
ウェブサイトの最適化では、最適化効果を高めるために HTML タグがよく使用されます。 Hタグはよく...
ユーザー エクスペリエンスによって、Web サイトのランキングと人気が決まります。以前は、Web サ...
好きだから、大好きです。 SEO の最前線で戦っている人たちは、そのために多額のお金を払っています。...
Dogyunの労働者の日特別プロモーションが始まりました:(1)新しいダイナミッククラウドが30%オ...
justhost は、ロシア極東のノボシビルスク データ センターで、デフォルトの最小帯域幅 200...
皆さんは、まだhost1plusの印象を持っていると思います。彼らの主な事業は、仮想ホスティング、V...
クラウド データ移行テクノロジは非常に成熟しており、多くの標準ルーチンとアーキテクチャ モデルを備え...
データ分析の役割は、すべての SEO 担当者にとって自明です。データ分析は、ウェブサイトの運用、ウェ...
数日前、Geek Park Innovation Conference で、2013 年の起業家に向...
タオバオのアフィリエイトプロモーションを計画していたとき、インターネットで無名の専門家が書いたチュー...
Hostkvm は現在、ロサンゼルス データ センターの US CN2 GIA VPS を 30% ...