単一のデータベースではネットワークのやり取りが不要なので、複数のテーブル間でトランザクションを実装するのは比較的簡単です。このタイプのトランザクションはローカル トランザクションと呼ばれます。 ただし、単一のデータベースのパフォーマンスがボトルネックに達すると、データベースを分割する必要があり、データベース間 (データベース インスタンス) トランザクション要件が発生します。エンタープライズアプリケーションの規模が拡大するにつれて、企業はビジネスの成長のニーズを満たすためにサービス指向の変革をさらに進めることになります。現在、マイクロサービス アーキテクチャはますます普及しており、サービス間のトランザクション シナリオも増加しています。 これらはすべて分散トランザクションです。分散トランザクションとは、トランザクションの開始者、参加者、データ リソース サーバー、およびトランザクション マネージャーが分散システムの異なるノードに配置されていることを意味します。 要約すると、分散トランザクションには 3 つのシナリオがあります。
この記事では、分散トランザクションの一般的なソリューションを紹介します。
一般的な解決策分散トランザクションは複数のローカル トランザクションで構成されます。分散トランザクションは複数のデバイスにまたがり、複雑なネットワークを通過します。厳格な取引の実施までの道のりは長く困難であると考えられます。 2PC2 フェーズ コミット (2PC) とは、トランザクションをコミットするときに、分散システム アーキテクチャ内のすべてのノード間の一貫性を確保するように設計されたアルゴリズムを指します。 図に示すように、全体のプロセスは 2 つの段階に分かれています。 2PCのメリットとデメリット2PC の利点は、参加者 (RM) 自体の機能を使用して、ビジネス ロジックに一切干渉することなく、ローカル トランザクションをコミットおよびロールバックできることです (TCC ソリューションと比較して)。 ただし、2PC には、同期のブロック、単一点障害、データの不整合という 3 つの大きな欠点もあります。
参加者 (RM) は操作を実行するときに同期的にブロックされるため、2PC プロセス中にロックされたリソースにアクセスするときは他のノードをブロックする必要があります。
コーディネーター (TM) は単一のポイントであり、コーディネーターが失敗すると、参加者は永久にブロックされます。ホットスポット リソースがブロックされると、システム全体に影響が及ぶ可能性があります。
第 2 フェーズでは、ネットワーク上の理由により、一部の参加者 (RM) がコーディネーター (TM) から情報を受信しなかったか、一部の参加者がコミット/ロールバック操作の実行時に例外に遭遇しました。これにより、データの不整合の問題が発生します。 2PC最適化Percolator は、BigTable 上に構築され、Google 内でウェブ インデックスの更新操作に使用される、Google の前世代の分散トランザクション ソリューションです。原論文は参考文献4に掲載されています。 TiDB のトランザクション モデルは Percolator のトランザクション モデルに従います。これについては、分散データベースに関する次のブログ投稿で説明します。 3PC2PC と比較して、3PC には 3 段階モードとタイムアウト メカニズムが追加されています。 タイムアウト メカニズム: 第 3 フェーズでは、参加者がコーディネータから長時間応答を受信しない場合、デフォルトでは、参加者はタイムアウトしたトランザクションを自動的にコミットします (コーディネータがロールバック コマンドを送信してデータの不整合が発生する場合でも)。 2PC 同期ブロッキングの問題を解決します。 同時に、3PC は第 1 段階のクエリ通知を追加して、2PC でのデータ不整合の問題の可能性を減らします。 ただし、3PC では 2PC の単一点障害の問題が解決されません。 3PC の 3 つの段階を図に示します。
要約する2PC と 3PC はどちらもプロトコルであり、指導理念であり、プロジェクトにおける実際の実施計画とは異なります。 ただし、トランザクション処理中にコーディネーターが複数のデータベース (RM) に同時に接続する必要があるため、2PC と 3PC は大規模な分散システムではほとんど使用されません。 通常、マイクロサービスはそれぞれの分野のデータベースに接続されます。マイクロサービスが別のフィールドのデータを変更する場合は、RPC インターフェースを介して実装する必要があり、複数のデータ ソースにはアクセスされません。複数のデータソースをリンクするコーディネーターが多すぎると、必然的にサービスガバナンスの難易度が高まり、データの混乱が発生する可能性があります。 TCC2PC と 3PC はどちらも、データベース トランザクションのコミットとロールバックに依存します。 しかし、テキスト メッセージの送信、写真のアップロード、その他のビジネス レイヤー ロジックなど、一部のビジネスではデータベース以外の処理も必要になる場合があります。 したがって、トランザクションの送信とロールバックは、データベース レベルではなくビジネス レベルに引き上げる必要があり、TCC はビジネス レベルでの 2 フェーズ コミットです。 TCC (Try、Commit、Cancel) は補償トランザクションです。このモデルでは、アプリケーションの各サービスが、試行、確認、キャンセルの 3 つのインターフェースを提供する必要があります。中心となる考え方は、まずリソースの予約を評価することです。トランザクションをコミットできる場合、予約されたリソースが確認されます。トランザクションをロールバックする必要がある場合、予約されたリソースは解放されます。 TCC は基本的にアプリケーション レベルの 2PC であり、次の図に示すように 2 つのステージに分かれています。 たとえば、控除サービスが TCC を使用する場合、資金を控除するための Try メソッドを記述する必要があります。実際の推論を実行するには Confirm メソッドも必要です。最後に、減算操作をロールバックするための Cancel メソッドを提供する必要があります。 元の方法を3つの方法に拡張する必要があることがわかり、TCCはビジネスに大きな侵入を持っています。 TCC はビジネスに侵入しますが、リソースをブロックすることはありません。各メソッドはトランザクションを直接送信します。エラーが発生した場合は、ビジネス レベルでのキャンセルによって補正されます。したがって、TCC は補償取引です。 2PC の単一点障害またはタイムアウトの問題に対する TCC の解決策は再試行を続けることです。つまり、応答を受信していない Confirm/Cancel インターフェイスを、成功するまで再試行し続けます。再試行戦略が失敗した場合、ログ記録とアラームを通じて手動介入が実行されます。 ただし、この再試行メカニズムにより、TCC のべき等性問題と空のロールバック問題が発生します。 注意が必要なTCCの問題
再調整メカニズムのため、繰り返し実行によるエラーを回避するために、Try、Confirm、Cancel の 3 つのメソッドをべき等として実装する必要があります。
ネットワークの問題により、参加者 (RM) の Try インターフェイス応答がコーディネーター (TM) によって正常に受信されなかった場合、コーディネーター (TM) はキャンセル コマンドを発行します。次に、Cancel インターフェースは Try を実行せずに正常にキャンセルできる必要があります。
トランザクション コーディネータが TCC サービスの第 1 フェーズの Try 操作を呼び出すと、ネットワークの輻輳によりタイムアウトが発生する可能性があります。この時点で、トランザクション コーディネータは第 2 フェーズのロールバックをトリガーし、TCC サービスのキャンセル操作を呼び出します。キャンセル呼び出しはタイムアウトしません。その後、ネットワーク上で輻輳した第 1 フェーズの Try データ パケットが TCC サービスによって受信され、第 1 フェーズの Try 要求の前に第 2 フェーズの Cancel 要求が実行されます。遅い Try を実行した後、この TCC サービスは第 2 フェーズの Confirm または Cancel を再度受信しなくなり、TCC サービスがハングすることになります。 したがって、TCC サービスを実装する場合、空のロールバックは許可する必要がありますが、ハングを回避するために、空のロールバック後の Try 要求も拒否する必要があります。 補償されたTCC上記は、分散トランザクションに関連するすべてのビジネスを制御する必要がある一般的な TCC について説明しています。しかし、場合によっては(たとえば、他社のインターフェースを呼び出すときなど)、一般的な TCC が機能しないことがあります。 したがって、代償的な TCC が存在し、これは Try のない TCC の一種として理解できます。 Try インターフェースが提供されていないため、これは Saga メカニズムの別の形式と見なすことができます。 たとえば、A から B へ、そして B から C へ飛ぶなど、乗り継ぎ便が必要で、乗り継ぎ便が異なる航空会社である場合は、AB と BC の両方のチケットを購入するのが合理的です。 このとき、航空会社のチケット購入操作が直接呼び出されます。両方の航空会社が航空券の購入に成功した場合は、直接成功となります。いずれかの会社がチケットの購入に失敗した場合は、キャンセル予約インターフェイスを呼び出す必要があります。 これは、TCC の第 2 ステージを直接実行するのと同じであり、ロールバック操作には特別な注意が必要です。ロールバックが失敗した場合は、アラームが記録され、手動で介入する必要があります。 要約するTCC トランザクションは、分散トランザクションをリソース レイヤーからビジネス レイヤーに移動するため、ビジネスはリソース ロックの粒度を柔軟に選択でき、グローバル トランザクションの実行中はロックが常に保持されるわけではないため、システム スループットは 2PC モードよりもはるかに高くなります。 TCC トランザクションによってエンジニアリングの複雑さ、ネットワーク遅延、およびサービス ガバナンスの難しさが増すため、支払いトランザクションに関連するコア ビジネス シナリオ (高い一貫性要件がある) でない限り、TCC トランザクションは他のビジネス シナリオでは使用しないでください。 サガトランザクション佐賀取引も補償取引です。 TCC の補償と同様に、Try フェーズはありません。代わりに、分散トランザクションは、一連のローカル トランザクションで構成されるトランザクション チェーンとして扱われます。 Saga トランザクションの基本プロトコルは次のとおりです。
取引チェーンに業務シーケンスのロジックが含まれている場合は、取引チェーンの順序を合理的に整理する必要があります(プロジェクトの利益を優先し、漏れがある場合は手動で補充できます。たとえば、出荷前に支払いを差し引く、返金前に商品を返品するなど)。 Saga モデルには準備フェーズがないため、トランザクション間の分離は保証されません。複数の Saga トランザクションが同じリソースに対して動作すると、更新の損失やダーティ データの読み取りなどの問題が発生します。このとき、同時実行性はビジネス レイヤーで制御する必要があります。たとえば、アプリケーション レイヤーでのロックや、アプリケーション レイヤーでのリソースの事前凍結などです。 発注プロセスを例にとると、全体の操作には、在庫の減算 (在庫サービス)、注文の作成 (注文サービス)、支払い (支払いサービス) などが含まれます。 トランザクションは正常に実行され、T1、T2、T3、...、Tn で完了します。たとえば、在庫の減算 (T1)、注文の作成 (T2)、支払い (T3) が順番に実行されます。しかし、決済サービスでエラーが発生します。現時点では、佐賀には 2 つの戦略があります。 Saga トランザクション回復戦略Saga は 2 つの回復戦略を定義します。
成功が必須であり、失敗した場合に再試行が実行されるシナリオに適用できます。実行順序は次のようになります: T1、T2、...、Tj(失敗)、Tj(再試行)、...、Tn。ここで、j はエラーが発生したサブトランザクションです。 明らかに、フォワードリカバリには必ずしも補償トランザクションは必要ありません。ビジネスにおけるサブトランザクションが(最終的に)成功するか、補償トランザクションを定義するのが困難または不可能な場合は、フォワードリカバリの方がニーズに合致します。 過度に積極的な再試行戦略 (間隔が短すぎる、再試行回数が多すぎるなど) は、下流のサービスに悪影響を及ぼす可能性があるため、より合理的な再試行メカニズムを使用する必要があります。
このアプローチの効果は、以前に成功したすべてのサブトランザクションをキャンセルし、Saga 全体の実行結果がキャンセルされることです。 以下に説明する例はすべて後方回復戦略です。 Saga トランザクション調整モードSaga がトランザクションを実行する順序は、Saga の調整ロジックと呼ばれます。この調整ロジックには、次の 2 つのモード (オーケストレーションとイベント コレオグラフィー) があります。
電子商取引の注文を例に挙げてみましょう。
制御クラスは、注文トランザクション全体を実行するために必要なプロセスを事前に認識している必要があります。いずれかが失敗した場合、各サブトランザクションにコマンドを送信して以前の操作を元に戻すことにより、分散ロールバックを調整する責任があります。すべてがコントロール クラスに基づいて調整されている場合、コントロール クラスはデフォルトで順方向のプロセスを実行し、ロールバックするときに逆方向のプロセスを実行するだけで済むため、ロールバックがはるかに簡単になります。
電子商取引の注文を例に挙げてみましょう。
実装の比較コーディネーションベースの Saga の利点は次のとおりです。
コーディネーションベースの Saga の欠点は次のとおりです。
イベント オーケストレーションに基づく Saga の利点は次のとおりです。
イベント オーケストレーションに基づく Saga の欠点は次のとおりです。
ローカルメッセージテーブルメカニズムに基づくローカル メッセージ テーブル メカニズムは、ローカル トランザクション メッセージ テーブルをデータベースに保存し、ローカル トランザクション操作の実行中に操作ステータスをローカル トランザクション メッセージ テーブルに挿入します。メッセージが正常に挿入されると、他のサービスが呼び出されます。呼び出しが成功すると、ローカル メッセージのステータスが変更されます。呼び出しが失敗した場合は、継続的に再試行されます。ダウンストリーム インターフェースでは冪等性を確保する必要があります。 ローカル メッセージ テーブル メカニズムは、ベスト エフォートの通知概念です。 ここでは、支払いサービスと会計サービスを例に、ローカル メッセージ テーブル ソリューションを紹介します。一般的なプロセスは次のとおりです。ユーザーが支払いサービスを通じて支払い注文を正常に完了すると、会計サービス インターフェイスが呼び出され、データベースに元の会計バウチャーが生成されます。全体的なプロセスを図に示します。 プロセスを完了する:
メッセージ回復システムが同じメッセージを一定のしきい値まで再配信すると、アラームが記録され、手動プロセスが通知されます。 要約するローカル メッセージ テーブル メカニズムの利点は、構築コストが比較的低いことですが、次の 2 つの欠点もあります。
トランザクションメッセージメカニズムに基づく2PC&3PC であっても TCC であっても、ローカル メッセージ トランザクションは基本的に XA プロトコルの考え方に準拠しています。つまり、これらのソリューションは本質的に、さまざまなトランザクション参加者のローカル トランザクションの進行を調整するトランザクション コーディネーターであり、すべてのローカル トランザクションが一緒にコミットまたはロールバックされ、最終的にグローバル実行機能が実現されます。調整プロセス中、コーディネータは各ローカルトランザクションの現在のステータスを収集し、これらのステータスに基づいて次のステージの操作指示を発行する必要があります。 しかし、これらのグローバル トランザクション ソリューションは、操作が面倒であったり、実行に時間がかかったり、グローバル トランザクション中に関連するリソースが排他的にロックされたりするため、分散システム全体のグローバル トランザクションの同時実行性はそれほど高くありません。これにより、電子商取引などの高同時実行シナリオのトランザクション スループット要件を満たすことが困難になるため、インターネット サービス プロバイダーは、XA プロトコルに反する多くの分散トランザクション ソリューションを検討してきました。その中でも、メッセージミドルウェアによって実装される結果的に一貫性のあるグローバルトランザクション(トランザクションメッセージトランザクション)は、古典的なソリューションです。 トランザクションメッセージメカニズムに基づく通常のメッセージでは、ローカル トランザクションの実行とメッセージ送信の一貫性の問題を解決できません。メッセージ送信はネットワーク通信プロセスであるため、メッセージ送信プロセスが失敗したり、タイムアウトしたりする可能性があります。タイムアウト後、メッセージは正常に送信されるか、失敗する可能性があります。メッセージの送信者を特定できないため、送信者がトランザクションをコミットするかロールバックするかによって不整合が発生する可能性があります。 この問題を解決するには、トランザクション メッセージを導入する必要があります。トランザクション メッセージと通常のメッセージの違いは、トランザクション メッセージが正常に送信された後、準備済み状態になり、サブスクライバーが使用できないことです。ダウンストリーム サブスクライバーは、トランザクション メッセージの状態が消費可能状態に変更された後にのみメッセージを監視できます。 トランザクション メッセージを送信するプロセスは次のとおりです。
ローカル トランザクションが実行された後、MQ に送信された通知メッセージが失われる可能性があります。したがって、トランザクション メッセージをサポートする MQ システムには、まだ「送信待ち」状態にあるメッセージをスキャンし、メッセージの送信者にクエリを送信してトランザクション メッセージの最終ステータスを問い合わせ、その結果に基づいてトランザクション メッセージのステータスを更新する、時間指定のスキャン ロジックがあります。したがって、トランザクションの開始者は、MQ システムにトランザクション メッセージ ステータス クエリ インターフェイスを提供する必要があります。
トランザクション メッセージのステータスが「送信可能」の場合、MQ システムはメッセージを下流の参加者にプッシュし、プッシュが失敗した場合は継続的に再試行します。
要約する最終的な一貫性は、トランザクション メッセージ メカニズムに基づいて実現されます。これは、非同期更新があり、データのリアルタイム要件が高くないシナリオに適しています。 ローカル メッセージ テーブルの実装と比較すると、ローカル メッセージ テーブルを作成したり、ローカル データベース トランザクションに依存したりする必要がないため、このソリューションは同時実行性の高いシナリオに適しています。 RocketMQ は、実稼働環境でのトランザクション ベースのメッセージング メカニズムの使用を直接サポートできます。その他のメッセージング ミドルウェア (Kafka、RabbitMQ など) では、信頼性の高いメッセージング サービスを開発してカプセル化する必要があります。 RocketMQ トランザクション メッセージは、トランザクション制約を満たすためのローカル トランザクション実行とメッセージ送信の問題を解決します。 Kafka トランザクション メッセージは、複数のメッセージを 1 つのトランザクションで送信して、複数のメッセージ間のトランザクション制約を確保する必要がある場合に使用されます。つまり、複数のメッセージが正常に送信されるか、送信に失敗するかのいずれかになります。 ベストエフォート通知メカニズムベスト エフォート通知メカニズムの本質は、定期的な検証メカニズムを導入することで最終的な一貫性を保証することです。ビジネスへの介入が少なく、MQ システムに対する要件も低く、実装も比較的簡単です。これは、プラットフォームや企業間のシステム間のビジネス相互作用など、最終的な一貫性と短いビジネス リンクに対する感度が低いシナリオに適しています。 適用可能なシナリオシャオミンさんは、中国聯通のオンラインビジネスホールを通じて携帯電話料金をトップチャージしている。全体の操作プロセスは次のとおりです。
技術の選択2PCと3PC2PC と 3PC はデータベースに大きく依存し、強力な一貫性と強力なトランザクション パフォーマンスを提供できますが、レイテンシは比較的高くなります。これらは、従来の単体アプリケーションに適しています。同じ方法ではデータベース間の操作が行われるため、大規模な分散、高同時実行性、高パフォーマンスのシナリオには適していません。 TCCTCC は、インターネット金融会社の 3 つのコア サービスである取引、支払い、会計など、実行時間が確実かつ短く、リアルタイム要件が高く、データの一貫性要件が高い状況に適しています。 サガトランザクションSaga トランザクションは、ビジネス プロセスが長く複数あり、同じリソースに対する同時操作が少ないビジネスに適しています。インターネットマイクロローン、チャネル統合シナリオ、金融機関ドッキングシステム(外部システムとのドッキングが必要)など、銀行や金融機関で広く使用されています。 ローカルメッセージテーブルメカニズムとトランザクションメッセージメカニズムに基づくどちらも、トランザクション参加者が操作の冪等性をサポートするのに適しており、一貫性の要件が低く、バックアップ メカニズムが最終的な一貫性を達成するまでビジネスにおけるデータの不整合を許容できます。取引にはより少数の当事者とより少ないリンクが関与し、ビジネスは調整/検証システムによってバックアップされます。 ベストエフォート通知メカニズムベスト エフォート通知メカニズムは、最終的な一貫性に対する感度が低く、ビジネス リンクが短いシナリオに適しています。 前提条件本文中に記載されている名詞の追加説明。 DTPモデルDTP (Distributed Transaction Process) は分散トランザクション モデルです。このモデルには、3 つの役割があります。
DTP モデルでは 3 つのロールが定義されていますが、実際の実装では 1 つのロールが同時に 2 つの機能を実行できます。たとえば、AP と TM を組み合わせると、TM のコンポーネントを個別に展開する必要はありません。 XA仕様XA は分散トランザクション処理仕様です。 XA は、TM と RM 間の通信インターフェース (下図の機能) を標準化し、TM と複数の RM 間の双方向通信ブリッジを形成して、複数のデータベース リソース下での強力な一貫性を保証します。現在よく知られているデータベース (Oracle、DB2、MySQL など) はすべて XA インターフェイスを実装しており、RM として使用できます。 トランザクション処理プロセス全体を通じて、データは常にロックされた状態になります。つまり、準備からコミット、ロールバックまで、TM は常にデータベース ロックを保持します。他のトランザクションがデータベース内のデータを変更する場合は、ロックが解除されるまで待機する必要があります。 |
<<: クラウドコンピューティングがIoTソリューションにもたらすもの
>>: クラウド コンピューティング アーキテクチャ: 避けるべき 5 つのよくある間違い
ほとんどのウェブマスターは、サイトのホームページがそもそも存在しないと、ウェブサイトの権威が下がるの...
A5ウェブマスターネットワーク(www.admin5.com)は3月21日、今月19日にCCTVの「...
従来のオンプレミス データ センターはまだ存在していますが、かつてそこで主流だったワークフローは急速...
NodeBladeは年末に設立され、米国フロリダ州に登録された小規模なホスティング会社です。主な事業...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています今日の世界...
今回、百度の青大根アルゴリズムのアップグレードは、これまでの数回のアルゴリズム調整を上回りました。元...
[編集者注] この記事の著者は@李建忠JZです。著者は、実は中国と海外のインターネットの歴史における...
Mianhua Cloud は江西楽旺ネットワークテクノロジー株式会社が所有するクラウドコンピューテ...
ウェブサイトの最適化を行う際、ウェブサイトのコアキーワードのランキングを向上させたいと考えています。...
Baidu アルゴリズムが Pomegranate にアップグレードされて以来、オリジナルの Mar...
SEO はどれほど神話的でしょうか? 分かりません。神話的という言葉は気軽に使えるものではありません...
dedispec.com には割引サーバーがたくさんあります。カンザス州の割引サーバーと似ていますか...
インターネット上のさまざまな業界のウェブサイトの中には、消費者が2度目を購入することがほとんどない業...
序文最近、Kubernetes を学習しながら、ポッドデータの永続化を実現したいと考えています。調査...
IT業界の発展の歴史には、iPhoneスマートフォン、第1世代Intel Centrinoノートパソ...