Alibaba の調整システムの詳細な分析: 分散トランザクションの一貫性の課題!

Alibaba の調整システムの詳細な分析: 分散トランザクションの一貫性の課題!

導入

みなさんこんにちは、私はXiaomiです!今日は、Alibaba の面接の質問で話題になっている「分散トランザクションの一貫性」についてお話します。インターネット技術の急速な発展に伴い、分散システムは大手インターネット企業のアーキテクチャの基礎の 1 つになりました。しかし、分散システムでは、トランザクションの一貫性をどのように確保するかが常に難しい問題であり、多くの注目を集めてきました。今日は、私の理解と経験に基づいて、このトピックを詳しく分析します。

写真

分散トランザクションを避け、軽量ソリューションを採用する

今日のインターネット時代では、分散システムの適用は大企業にとって標準となっています。しかし、結果として生じる分散トランザクションの一貫性の問題は、開発者にとって大きな問題となっています。この問題に直面して、私たちの主な目的は、分散トランザクションの使用を可能な限り避け、代わりに軽量なソリューションを採用してデータの一貫性を確保することです。

分散トランザクションを避けるべき理由は何ですか?まず、分散トランザクションの実装は比較的複雑です。ノード間の通信や調整を考慮する必要があるだけでなく、さまざまな異常事態への対応も必要となり、システムの保守コストが増加します。第二に、分散トランザクションはシステムにさらなるパフォーマンスのオーバーヘッドをもたらし、システムのスループットと応答時間に大きな影響を与えます。最も重要なことは、分散トランザクションに問題が発生すると、システム全体の安定性に影響し、システムがクラッシュすることもあるということです。

では、分散トランザクションを回避するにはどうすればよいでしょうか?まず、単一プロセス内のトランザクション操作では、データベース トランザクションを使用して原子性と一貫性を確保できます。データベース トランザクションの実装は比較的シンプルでパフォーマンスも優れているため、リアルタイム要件が低いさまざまなビジネス シナリオの処理に適しています。次に、プロセス間通信のシナリオでは、非同期通信にメッセージ キューを使用することを検討できます。メッセージ キューは信頼性と安定性が高く、システム間の依存関係を効果的に分離できるため、システム間の結合が減り、システムの保守性とスケーラビリティが向上します。

分散システムでトランザクションの一貫性を実現するための主流のソリューション

分散システムでは、トランザクションの一貫性を確保することが重要です。この課題に対処するために、分散システムの各ノードでのデータ操作が一貫した状態に達することを保証することを目的とした、さまざまな主流のソリューションが業界で登場しました。

  • 最終的な一貫性ソリューションは、メッセージ キューに基づく信頼性の高いメッセージ配信メカニズムです。メッセージ キューを通じて、システムはデータを非同期的に送信および処理し、最終的に一貫した状態に到達できます。このソリューションは、高いリアルタイム パフォーマンスを必要としないビジネス シナリオに適しており、システムのスループットと同時実行パフォーマンスを効果的に向上できます。
  • 再試行と確認に基づくベスト エフォート通知スキームは、再試行と確認のメカニズムに基づくベスト エフォート通知スキームです。システムは通知の送信時に複数回再試行し、受信側で確認して、メッセージの確実な配信を保証します。このソリューションは、データの一貫性に対する要件が高いビジネス シナリオに適しており、メッセージの損失や重複処理の問題を効果的に軽減できます。

理論的には実現可能だが推奨されない解決策

分散システムでトランザクションの一貫性を扱う場合、理論的には実現可能だが推奨されない解決策がいくつかあります。これらのソリューションは理論上はデータの一貫性を保証できますが、実際のアプリケーションではさまざまな問題があり、インターネット業界の実際のシナリオには適していません。

まず、2 フェーズ コミット (2PC) は、コーディネータと参加者間の相互作用を通じてトランザクションの一貫性を保証する、従来の分散トランザクション プロトコルです。しかし、2PC には単一障害点やパフォーマンスのボトルネックという問題があり、ネットワーク分割やノード障害が発生した場合にはトランザクションがブロックされ、システムの可用性と信頼性が低下します。

次に、3 フェーズ コミット (3PC) は 2PC の改良版であり、タイムアウト メカニズムと状態同期メカニズムを導入することで、トランザクションのブロック時間を短縮し、単一点障害の影響を軽減します。ただし、3PC の実装は比較的複雑であり、ネットワーク パーティションやノード障害などの状況ではトランザクション ブロックの問題が依然として存在するため、高同時実行性、高可用性が求められるインターネット ビジネス シナリオには適していません。

さらに、補正トランザクション (TCC) とロング トランザクション (SAGA) は、トランザクション実行の前後に補正操作を導入することでトランザクションの一貫性を保証する、補正メカニズムに基づく分散トランザクション ソリューションです。ただし、TCC と SAGA の実装の複雑さは比較的高く、ビジネス ロジックの要件も高いため、追加のリスクや不確実性が生じやすいため、すべてのビジネス シナリオに適しているわけではありません。

ローカルデータトランザクションの原則

ローカル データベース トランザクションの原則には、UNDO ログ、REDO ログ、データベース ロック、マルチバージョン同時実行制御 (MVCC) などの複数の主要コンポーネントが含まれており、これらが連携してトランザクションの原子性、一貫性、分離性、および永続性を保証します。

まず、トランザクションの実行が開始されると、データベースは現在のデータ ステータスを UNDO ログに記録します。これにより、トランザクション実行中に例外が発生した場合や、トランザクションをロールバックする必要がある場合でも、UNDO ログに基づいてデータベースをトランザクション実行開始前の状態に復元できます。これにより、トランザクションのアトミック性が保証されます。つまり、トランザクションは完全に実行されるか、完全にロールバックされ、部分的な実行は行われません。

次に、トランザクションが完了すると、データベースはトランザクションの実行後のデータの状態を REDO ログに記録します。これにより、データベースが異常終了した場合でも、システムはREDOログに基づいてデータベースをトランザクション完了後の状態に復元できるため、トランザクションの永続性が確保され、トランザクションの結果が失われることはありません。

さらに、データベースはデータベース ロック メカニズムを通じてトランザクションの分離を保証します。トランザクションがデータベース内のデータを変更する必要がある場合、データベースは対応するデータ行またはデータ テーブルをロックして、他のトランザクションによる変更やアクセスを防止し、同時操作によって発生するデータの不整合の問題を回避します。

さらに、マルチバージョン同時実行制御 (MVCC) は、データベースに複数のデータ バージョンを保存することでトランザクションの分離を実現する、一般的に使用されるトランザクション分離メカニズムです。トランザクションの実行が開始されると、データベースはそのトランザクションのスナップショットを作成します。トランザクションはスナップショット内のデータのみを表示でき、他のトランザクションの影響を受けません。これにより、トランザクション間の干渉を回避し、データベースの同時実行パフォーマンスを向上させることができます。

分散トランザクションの原則

分散システムにおけるトランザクション処理は、トランザクションの原子性、一貫性、分離性、および永続性を確保するために複数の側面を総合的に考慮する必要がある複雑かつ重要な問題です。分散システムでは、トランザクションの一貫性を実現することは非常に困難な作業であり、分散システム内のデータ操作が一貫した状態になるように、グローバル トランザクション コーディネーター、グローバル ロック、ローカル データベース トランザクションなどの複数のメカニズムを使用する必要があります。

まず、グローバル トランザクション コーディネーターは、分散システムにおけるトランザクションの一貫性を確保するためのコア コンポーネントの 1 つです。さまざまな参加ノード間でトランザクションの実行順序を調整し、システム全体でトランザクションの実行順序が一貫していることを保証する役割を担います。グローバル トランザクション コーディネータは、各参加ノードに指示を送信し、各ノードの実行結果を収集することで、トランザクションの一貫性を実現します。

第二に、グローバル ロックは分散システムにおけるトランザクションの分離を保証する重要な手段です。グローバル ロックを使用すると、複数のトランザクションが同時に同じデータを変更するのを防ぎ、データの読み取りと書き込みの競合を回避し、トランザクションの分離を確保できます。

さらに、ローカル データベース トランザクションも、分散システムにおけるトランザクションの一貫性を確保する上で重要な役割を果たします。各参加ノードは、トランザクションを実行するときにローカル データベース トランザクションを使用して、データの原子性、一貫性、分離性、および永続性を保証します。ローカル データベース トランザクションは、UNDO ログ、REDO ログ、データベース ロック、MVCC などのメカニズムを通じてトランザクションの一貫性を実現し、グローバル トランザクション コーディネーターおよびグローバル ロックと連携して、分散システムにおけるトランザクションの一貫性を確保します。

推奨事項: 自社開発の補償/MQソリューション + 手動介入

当社では、分散システムにおけるトランザクションの一貫性の問題を解決するために、システムの安定性、パフォーマンス、保守性の確保を目的とした包括的なソリューションを採用しています。

まず、分散トランザクションへの過度の依存を避け、代わりに軽量なソリューションを採用してデータの一貫性を確保しました。単一プロセス内のトランザクション操作では、データベース トランザクションを最大限に活用して、原子性と一貫性を確保します。ローカル データベース トランザクション メカニズムを使用すると、分散トランザクションによって生じる追加のオーバーヘッドと複雑さを回避しながら、単一のサービス内のデータ操作が一貫した状態になることを保証できます。

次に、プロセス間通信シナリオでは、非同期通信にメッセージ キューを使用します。メッセージ キューを使用すると、システムのスケーラビリティと保守性を確保しながら、異なるサービス間のデータ転送の信頼性と効率が向上します。メッセージ キューの導入により、システム間の結合が減少し、システムの全体的なパフォーマンスと柔軟性が向上します。

実際のアプリケーションでは、これら 2 つのメカニズムを効果的に調整しています。複数のサービスが関与する業務オペレーションについては、複数の独立したアトミックオペレーションに分割し、メッセージキューを使用して対応するサービスにデータを送信することで、分散トランザクションの分離と非同期化を実現します。ローカル データベース トランザクション メカニズムとメッセージ キューの連携により、システムのデータ一貫性が確保されるだけでなく、システムのパフォーマンスと保守性が向上し、ユーザーに優れたサービス エクスペリエンスが提供されます。

さらに、システム調整中の一貫性の問題を解決するために、独自に開発した補正/MQ ソリューションと手動介入も採用しました。このソリューションは、システムの安定性を保証するだけでなく、パフォーマンスの低下を最小限に抑え、システムの制御性と保守性を向上させます。これにより、さまざまなビジネス シナリオにおける分散トランザクションの問題に柔軟に対応し、システムの安定した運用を確保できます。

非推奨: Seata ATモード

Seata AT モードは、Alibaba のオープンソース分散トランザクション ソリューションです。ただし、実際のアプリケーションでは、Seata AT モードを使用するとパフォーマンスが低下する可能性があります。統計によると、Seata AT モードを使用すると平均パフォーマンスが 35% 以上低下し、これは無視できない課題です。

パフォーマンスの低下は主に、Seata AT モードで採用されている 2PC (2 フェーズ コミット) プロトコルが原因です。分散トランザクションでは、2PC は複数の参加ノードのトランザクション操作を調整する必要があります。これには、事前コミットと最終コミットの 2 つの段階が含まれます。この調整メカニズムにより、ネットワーク通信のオーバーヘッドと待機時間が増加し、トランザクション実行の効率が低下します。

さらに、Seata AT モードでは、グローバル トランザクション コーディネーターと参加ノード間の頻繁な通信と同期が必要になるため、これによってもシステム負荷と応答時間が増加します。特に、同時実行性が高く、データ量が多いシナリオでは、このパフォーマンスの低下はさらに顕著になり、システムのパフォーマンスがビジネス ニーズを満たせなくなる可能性があります。

ただし、Seata AT モードではパフォーマンスが低下するという問題があるものの、特定のシナリオでは依然として実行可能なオプションであることは言及する価値があります。たとえば、データの一貫性に対する要件は高いが同時実行性はそれほど必要ではないビジネス シナリオの場合、Seata AT モードを使用するとトランザクションの一貫性を確保でき、ある程度のパフォーマンスの低下は許容できます。

非推奨: RocketMQ トランザクション メッセージ

RocketMQ トランザクション メッセージングは​​強力な分散メッセージング ソリューションですが、特に強力な同期を伴うリンクの処理など、一部のビジネス シナリオには適用できない場合があります。

メッセージの順序を保証する必要があるビジネス シナリオや非常にリアルタイムなビジネス シナリオなど、強力な同期を伴うリンクの処理には、RocketMQ トランザクション メッセージは適さない可能性があります。 RocketMQ トランザクション メッセージ処理メカニズムでは、メッセージをメッセージ キューに送信する前にローカル トランザクションが完了するのを待つ必要があるため、メッセージ送信に遅延や不確実性が生じます。同期が強力なビジネス シナリオでは、遅延や不確実性がビジネス プロセスに悪影響を及ぼし、一連の問題を引き起こす可能性もあります。

さらに、メッセージの順序を保証する必要があるビジネス シナリオでは、RocketMQ トランザクション メッセージにもいくつかの制限がある場合があります。 RocketMQ トランザクション メッセージは、ローカル トランザクションを通じてメッセージの順序とメッセージが送信される順序を保証できますが、実際のアプリケーションでは、ネットワークの遅延やノード障害などの要因により、メッセージの順序が乱れ、ビジネス ロジックにエラーや不整合が生じる可能性があります。

ただし、非同期性が強く、メッセージ シーケンスにあまり依存しない一部のビジネス シナリオでは、RocketMQ トランザクション メッセージングは​​依然として非常に効果的な選択肢となります。たとえば、データの最終的な一貫性を保証する必要があるものの、メッセージ送信のリアルタイム性とシーケンシャル性に対する要件は高くないビジネス シナリオの場合、RocketMQ トランザクション メッセージはニーズを十分に満たし、トランザクション ステータスとコールバック メカニズムを通じてメッセージの信頼性の高い送信を保証し、システムの安定性と信頼性を確保します。

下流 MQ の消費成功問題

メッセージ キュー システムでは、メッセージが下流のコンシューマーによって正常に消費されることを保証することが重要です。メッセージが正常に消費されない場合は、データの損失、ビジネス ロジック エラー、システムの不整合などの重大な結果につながる可能性があります。したがって、下流の MQ コンシューマーがメッセージを正常に消費できる必要があることを強調します。メッセージの消費が失敗したり、異常な状況が発生した場合は、システムの安定した動作とデータの一貫性を確保するために迅速に介入する必要があります。

メッセージが正常に消費されることを保証するには、まずメッセージの送信者と受信者の間で適切な通信メカニズムとプロトコルを確立する必要があります。メッセージ送信者は、メッセージをタイムリーにメッセージ キューに送信し、メッセージ送信の信頼性を確保できる必要があります。メッセージがタイムリーかつ正確に消費されることを保証するために、メッセージ受信者は高い信頼性と高い同時処理能力を備えている必要があります。

メッセージのコンシューマー側では、メッセージが繰り返し消費されてもシステムに悪影響を与えないように、べき等性を実装する必要があります。べき等性を実現することで、メッセージの繰り返し消費によって発生するデータ エラーやビジネス ロジックの異常を効果的に回避し、システムのデータの一貫性と安定性を確保できます。

さらに、メッセージの消費が失敗したり例外が発生したりした場合は、すぐに介入する必要があります。これを処理する一般的な方法は、失敗した消費メッセージを手動処理キューに転送し、専門家が分析および処理することです。手動介入により、メッセージ消費障害の原因を迅速に発見して解決し、システムの正常な動作とデータの一貫性を確保できます。

冪等性の実現

メッセージ キュー システムでは、べき等性を実現することが重要です。べき等性とは、メッセージが何回消費されてもシステムの状態は変更されず、システムのデータの一貫性と安定性が保証されることを意味します。したがって、重複したメッセージの消費から生じる可能性のあるリスクと課題に対処するには、必ずべき等性を実現することが必要であることを強調します。

べき等性を実現するための鍵は、消費者のビジネス ロジックを設計することにあります。まず、コンシューマーの処理ロジックがべき等であること、つまり同じメッセージが複数回消費されてもシステムの状態が一貫していることを確認する必要があります。これには通常、異なるメッセージを区別し、この情報に基づいてメッセージが処理されたかどうかを判断するために、コンシューマーのビジネス ロジックに一意の識別子やバージョン番号などの情報を追加する必要があります。

第二に、消費者のビジネス ロジックに冪等性チェックと保護メカニズムを実装する必要があります。これには、重複した消費が影響を与えないようにするための、コンシューマーの処理ロジックの冪等性チェックが含まれます。同時に、重複したデータの挿入や更新を防ぐために、データベース操作で一意のインデックスや楽観的ロックを使用するなど、消費者の処理ロジックに冪等性の保護策を追加する必要があります。

さらに、メッセージの一意の識別子やメッセージ ID などの情報を使用して、メッセージの重複排除と冪等性を実現することもできます。処理されたメッセージの ID を記録することで、コンシューマーが冪等性チェックを実行するときにメッセージが処理されたかどうかをすばやく判断でき、繰り返しの消費や繰り返しの処理を回避できます。

終わり

一般的に、分散トランザクションは複雑かつ重要なトピックであり、実際のビジネス シナリオに基づいて適切なソリューションを選択する必要があります。ソリューションを選択する際には、パフォーマンス、保守性、ビジネス ニーズを考慮して、最も適切な決定を下す必要があります。

<<:  テンセントクラウドとサウジアラビアの通信事業者モビリーが協力を深め、世界企業の中東での事業展開を支援

>>:  Docker イメージに基づいて Dockerfile をリバース エンジニアリングする方法

推薦する

クラウドコンピューティング2018年中間レビュー:全体的な状況は決まり、変数はまだ存在し、新しい道が出現する

あっという間に2018年も半分が過ぎ、総括する時期が来ました。 2018年上半期を振り返ると、徐々に...

Redis に基づく分散ロックと Redlock アルゴリズム

[[403381]]この記事はWeChatの公開アカウント「UP Technology Contro...

Docker による動的ツール: 見落とされがちなベストプラクティス

[[252870]]コンテナは、大企業から小企業まで、急速に一般的な導入ツールになりつつあります。 ...

最適化にはサブドメインとサブディレクトリのどちらが適していますか?

ウェブサイトには、URL でマークされた複数または N 個のページがあります。ウェブサイトを最適化す...

Pacificrack の VPS 価格が大幅に値下げされました (SSD コストは通常​​に戻りました)

ここ数ヶ月、CHIAマイニングにより、世界中のソリッドステートドライブの価格が急騰しました。ハードド...

Openstack Vlan モードでの分離とデータフロー

1. 孤立コンピュータ ネットワークは階層的に実装されており、異なるプロトコルが異なる階層で動作しま...

RHEL 8.5はコンテナの重要な改善を実現

[51CTO.com クイック翻訳] Red Hat Enterprise Linux の最新バージ...

フォーラム署名推進における5つの経験

1. フォーラムのニックネームとアバターニックネームを設定する際は、覚えやすく意味があり、広告効果の...

2018 年の 8 つの主要なクラウド コンピューティング データを 1 つの記事で理解しましょう。

クラウドやクラウドに関する最善の決定を組織内の他の人に説明するときは、それを裏付けるデータが必要です...

BandwagonHostの登録に関するチュートリアル、BandwagonHostの登録の詳細について説明します

BandwagonHost VPS の登録プロセスは比較的簡単です。登録できない方もいらっしゃるでし...

ウェブサイトの作成と最適化のための3つの前提条件

私、Ni Yeming を含め、ウェブサイトを構築する前に、なぜウェブサイトを構築したいのかをはっき...

ハイブリッドクラウド管理を最適化するための5つのヒント

多くの企業がハイブリッド クラウドを採用しているのは、オンプレミスのインフラストラクチャ、プライベー...

仮想化バックアップについてお話しましょう

1. 概要仮想化バックアップ テクノロジーは、VMware によって最初に提供され、開始されました。...