著者は、正確にスケジュールされたタスクと遅延キュー処理機能を備えた、高同時実行シナリオ向けのシンプルで安定したスケーラブルな遅延メッセージ キュー フレームワークを個人的に開発しました。半年以上前にオープンソース化されて以来、10 社を超える中小企業に正確でタイムリーなスケジューリング ソリューションを提供することに成功し、実稼働環境でのテストにも耐えてきました。より多くの人々の利益のために、オープンソース フレームワークのアドレスが提供されるようになりました: https://github.com/sunshinelyz/mykit-delay PS: ソース コードにスターを付けていただくことも歓迎します。また、素晴らしいコードを PR することもできます。 序文 この記事を書いたきっかけは、私と親しい友人が大手インターネット企業に面接に行ったことです。インタビュアーは分散トランザクションについて質問しました。残念ながら、彼は分散トランザクションについて深い理解を持っておらず、面接の結果は非常に残念なものとなりました。しかし、この友人はまだかなり楽観的で、[分散トランザクション]に関する一連の記事を書くように依頼しました。分散トランザクションに関する私の欠点を改善したい場合は、[分散トランザクション]に関する特別なトピックを作成します。特別トピックの内容は、原則、フレームワークのソースコード、エンタープライズレベルの実装をカバーする予定です。この記事は、このトピック全体の始まりとみなすことができます。それが友人たちに大きな助けとなることを願っています。 地方問題 ローカルトランザクションプロセス 分散トランザクションを紹介する前に、ローカルトランザクションについて見てみましょう。まずは写真を見てみましょう。 上の図から、ローカル トランザクションはリソース マネージャー (DBMS、データベース管理システムなど) によってローカルに管理されていることがわかります。 ローカル取引のメリットとデメリット 地方の問題にはそれに応じた長所と短所があります。 アドバンテージ:
欠点:
ACIDプロパティ トランザクションについて話すときは、トランザクションの ACID プロパティについて言及する必要があります。
分散トランザクション ビジネスの急速な発展に伴い、Web サイト システムはモノリシック アーキテクチャから分散型マイクロサービス アーキテクチャへと徐々に進化する傾向があり、データベースは単一マシン データベース アーキテクチャから分散型データベース アーキテクチャへと変化する傾向があります。この時点で、大規模なアプリケーション システムを、独立して展開できる複数のアプリケーション サービスに分割し、トランザクション操作を完了するにはサービス間のリモート コラボレーションが必要になります。 最初のシステムのモノリシック アーキテクチャを表すには、次の図を使用します。 上図では、同じプロジェクト内の異なるモジュールを異なるパッケージに整理して管理していますが、すべてのプログラム コードは同じプロジェクト内に配置されています。 その後、ビジネスの発展に伴い、分散型のマイクロサービス アーキテクチャに拡張しました。この時点で、以下に示すように、大規模なプロジェクトを、それぞれ独自のデータベースを持ち、独立してデプロイできる小さなマイクロサービスに分割します。 たとえば、私たちのプログラムでは、ニーズを満たすために、同じトランザクション内で次のようなコードを実行することがよくあります。
上記のコードのビジネスでは、submitOrder() メソッドに @Transactional アノテーションのみを追加します。これにより、分散シナリオにおける分散トランザクションの問題を回避できますか?明らかにそうではありません。 上記コードに対応する情報、すなわち注文情報、資金口座情報、ポイント情報、取引フローおよびその他の情報がそれぞれ異なるデータに保存されている場合、支払いが完了した後、通知された対象システムのデータも異なるデータベースに保存されます。ここで、分散トランザクションの問題が発生します。 分散トランザクションのシナリオ クロスJVMプロセス モノリシック プロジェクトを分散型のマイクロサービス プロジェクトに分割すると、各サービスが連携して、リモート REST または RPC 呼び出しを通じてビジネス操作を完了します。典型的なシナリオは、ショッピングモール システム内の注文マイクロサービスと在庫マイクロサービスです。ユーザーが注文を行うと、注文マイクロサービスが注文マイクロサービスにアクセスします。注文マイクロサービスが注文レコードを生成すると、在庫マイクロサービスを呼び出して在庫を差し引きます。各マイクロサービスは異なる JVM プロセスにデプロイされます。このとき、JVM 間プロセスによって分散トランザクションの問題が発生してしまいます。 データベースインスタンス全体 単一のシステムが複数のデータベースインスタンスにアクセスする場合、つまりデータソース間にアクセスする場合、分散トランザクションが生成されます。たとえば、システム内の注文データベースとトランザクション データベースは、異なるデータベース インスタンスに配置されます。ユーザーが払い戻しを開始すると、ユーザーの注文データベースと取引データベースが同時に操作されます。返金操作はトランザクション データベースで実行され、注文データベースで注文ステータスが返金済みに変更されます。データは異なるデータベース インスタンスに分散されるため、データベース内のデータを操作するには異なるデータベース接続セッションが必要です。このとき、分散トランザクションが生成されます。 複数のサービス、単一のデータベース 複数のマイクロサービスが同じデータベースにアクセスします。たとえば、注文マイクロサービスと在庫マイクロサービスが同じデータベースにアクセスすると、分散トランザクションも生成されます。その理由は、複数のマイクロサービスが同じデータベースにアクセスすると、基本的には異なるデータベース セッションを通じてデータベースを操作することになり、分散トランザクションが生成されるからです。 注: データベース インスタンス間のシナリオとマルチサービスの単一データベース シナリオはどちらも、基本的には、データベース内のデータを操作するために異なるデータベース セッションが生成され、分散トランザクションが生成されるためです。これら 2 つのシナリオは見落とされがちです。 分散トランザクションソリューション 分散トランザクションが発生するシナリオがわかったので、分散トランザクションの具体的なソリューションについて説明しましょう。 2PCソリューション 2PC (2 フェーズ コミット プロトコル) は、トランザクション プロセス全体を準備フェーズとコミット フェーズの 2 つのフェーズに分割します。 2 は 2 つのフェーズ、P は準備フェーズ、C はコミット フェーズを表します。 ここでは、MySQL データベースを例として使用します。 MySQL データベースは 2 フェーズ コミット プロトコルをサポートしており、成功と失敗の 2 つの状況に分けられます。 成功 失敗 具体的なプロセスは以下のとおりです。 準備フェーズ: トランザクション マネージャーは各参加者に準備メッセージを送信します。各データベース参加者はトランザクションをローカルで実行し、ローカルの Undo/Redo ログを書き込みます。現時点ではトランザクションはコミットされていません。 (UNDO ログは変更前のデータを記録し、データベースのロールバックに使用されます。一方、REDO ログは変更後のデータを記録し、トランザクションをコミットした後にデータ ファイルを書き込むために使用されます) コミット フェーズ: トランザクション マネージャーが参加者から実行失敗またはタイムアウト メッセージを受信すると、各参加者にロールバック メッセージを直接送信します。それ以外の場合はコミット メッセージを送信します。参加者は、トランザクション マネージャーの指示に従ってコミットまたはロールバック操作を実行し、トランザクション処理プロセスで使用されたロック リソースを解放します。 2PC ソリューションを使用する場合、最終段階でロック リソースを解放する必要があることに注意することが重要です。 信頼性の高いメッセージ最終一貫性ソリューション 信頼性の高いメッセージ最終一貫性ソリューションとは、トランザクション開始者がローカル トランザクションを完了してメッセージを送信すると、トランザクション参加者 (メッセージ コンシューマー) が確実にメッセージを受信してトランザクションを正常に処理できることを意味します。このソリューションは、メッセージがトランザクション参加者に送信されている限り、最終的なトランザクションは一貫している必要があることを強調しています。 トランザクション イニシエーター (メッセージ プロデューサー) はメッセージをメッセージ ミドルウェアに送信し、トランザクション参加者はメッセージ ミドルウェアからメッセージを受信します。トランザクション イニシエーターとメッセージ ミドルウェア、およびトランザクション参加者 (メッセージ コンシューマー) とメッセージ ミドルウェアは、ネットワークを介して通信します。ネットワーク通信の不確実性により、分散トランザクションの問題が発生する可能性があります。そこで、具体的なプランではメッセージ確認サービスとメッセージ回復サービスを導入します。 信頼性の高いメッセージ最終整合性ソリューションを使用する場合、注意すべき問題がいくつかあります。
TCCプログラム TCC は 3 つの段階に分かれています。
TCC 分散ソリューションを使用する場合は、空のロールバック、べき等性、中断などの問題に注意する必要があります。 ベストエフォート通知制度 このソリューションは、次の図に示すように、複数の異なるシステム間でのデータの最終的な一貫性を確保するため主に使用されます。 ベストエフォート通知ソリューションを使用する場合は、べき等性とデータ取得操作に注意する必要があります。 さて、今日はこれで終わりです。各分散トランザクションソリューションについては後ほど詳しく紹介します。また次回お会いしましょう!! この記事はWeChatの公開アカウント「Glacier Technology」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Glacier Technology 公式アカウントまでご連絡ください。 |
ウェブサイトを選択する際、人々は通常、ウェブサイトのトラフィック データ、広告スペースのサイズなど、...
SEO をプレイすることは、オンライン ゲームをプレイするようなものです。ランキングが上がるたびに、...
Discuz! 愛好家ネットワークが4月20日に報告 (文/ウェブマスター Ajian) 4月20日...
2015 年の旧正月が近づいてきました。皆様に楽しい旧正月をお過ごしいただくことをお祈りするとともに...
Google は、ウェブサイト自体とユーザーの所在地に基づいて、異なる検索結果を表示することがよくあ...
IT 業界の発展と変化に伴い、IT アプリケーションの基盤となるサポートも、メインフレーム、ミニコン...
2021 年にクラウド インフラストラクチャに触れるほぼすべての人が、Kubernetes プロジェ...
女性は買い物に行き、男性はバッグを持つものだと信じているに違いありません。同様に、多くの人の印象では...
私たちは、どんなウェブマスターもウェブサイトを最適化する過程でユーザーにサービスを提供するという目的...
ハリウッドのヌード写真スキャンダルに関与した有名人数名の代理人を務める弁護士マーティ・シンガー氏は、...
2020 年 8 月、サイバーセキュリティ ソリューションのプロバイダーである Check Poin...
適切なクラウド データベースがあれば、クラウドからモバイル、エッジに至るまで、企業が依存するさまざま...
1. SERP機能の台頭以前は、オーガニックランキングができるだけ多くのトラフィックを獲得する方法だ...
CNNICの最新レポートによると、現在、企業のインターネット利用率は95%を超えており、そのうち48...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています最近、百度...