ホームページ  >  記事  >  Java  >  分散トランザクション: 信頼性の高いメッセージの結果整合性スキーム

分散トランザクション: 信頼性の高いメッセージの結果整合性スキーム

Java后端技术全栈
Java后端技术全栈転載
2023-08-24 15:27:42736ブラウズ


よく出てくる ACID など、誰もが知っている事柄でしょうが、その後の ディストリビューションについては分散トランザクション の内容については、まず ACID について説明し、次に 分散トランザクション とは何かを紹介し、最後に 信頼性の高いメッセージ 分散トランザクション ソリューションに焦点を当てます。 。

#トランザクションとは

厳密な意味でのトランザクションは次のとおりです。

ACID と呼ばれる原子性、一貫性、分離性、耐久性を備えています。

  1. 原子性 (原子性) は、トランザクション内のすべての操作が実行されるか実行されないかのいずれかであると理解できます。
  2. 一貫性 (一貫性) は、データが整合性制約を満たす、つまり中間状態のデータが存在しないと理解できます。財布には 100 があり、私の財布には 100 があり、あなたは私に 50 をくれます。この時点で、あなたの財布の中のお金は 50、私の財布の中のお金は 150 であるはずです。私のお金が追加される中間状態は存在せず、あなたのお金は差し引かれません。
  3. 分離 とは、複数のトランザクションが同時に実行されたときに互いに干渉しない、つまり、1 つのトランザクション内のデータが他のトランザクションに影響を与えないという事実を指します。孤立している。
  4. 耐久性 (耐久性) は、トランザクションの完了後、データが永久に保存され、その後の他の操作や障害がトランザクションに影響を与えないという事実を指します。 . 結果に影響を与えます。

一般的な意味では、トランザクションとは、いくつかの更新操作を行うことです。成功するか失敗します

#分散トランザクションとは

分散トランザクション名前のとおり、分散システムでトランザクションを実装するものですが、実際には複数の ローカル トランザクション で構成されます。

大きな操作は、さまざまな小さな操作で構成されます。これらの小さな操作は、異なるサーバーに分散されます。 分散トランザクションこれらの小さな操作がすべて成功するか、すべて失敗するかを確認する必要があります。本質的に、分散トランザクションは、異なるデータベースデータの一貫性を保証することです。

一般的な分散トランザクション ソリューションには次のものがあります: 2PC、3PC、TCC、ローカル メッセージ テーブル、信頼できるメッセージの結果整合性、ベストエフォート型通知 など。

今日、 信頼できるメッセージの結果整合性のためのソリューション

信頼できるメッセージの結果整合性スキームとは何か に焦点を当てます。

信頼性の高いメッセージ結果整合性スキームとは、トランザクション開始者がローカル トランザクションを完了すると、メッセージを メッセージ ミドルウェア##に送信することを意味します #, Transaction参加者 (メッセージ コンシューマー) は、メッセージを受信して​​トランザクションを正常に処理できる必要があります。このソリューションでは、メッセージがトランザクション参加者に送信される限り、最終的なトランザクションは一貫性を保たなければならないことを強調しています。

この方法にはどのような問題があるのでしょうか?

このソリューションは、メッセージ ミドルウェアを通じて実装されます。トランザクションの開始者 (メッセージ プロデューサ) がメッセージ ミドルウェアにメッセージを送信し、トランザクションの参加者がメッセージ ミドルウェアからメッセージを受信します。ネットワーク 通信の不確実性は、以下に示すような分散トランザクションの問題を引き起こします。

分散トランザクション: 信頼性の高いメッセージの結果整合性スキーム

  1. #ローカル トランザクションとメッセージのアトミック性の問題

分散トランザクション: 信頼性の高いメッセージの結果整合性スキーム

上の点線のボックスに示されているように、次のような状況が発生します。


1) ローカル トランザクションの送信に失敗するとなり、メッセージは送信されません。
2) ローカル トランザクションは成功しますが、メッセージの送信は失敗し、ローカル トランザクションはロールバックされます。
3) ローカル メッセージは成功し、メッセージはタイムアウトになり、ローカル トランザクションはロールバックされ、最終的にメッセージは失敗します。
4) ローカル メッセージは成功し、メッセージはタイムアウトになり、ローカル トランザクションはロールバックされ、最終的にメッセージは成功します。

要約すると、4 番目の状況 があり、ローカル トランザクションがメッセージ参加者のトランザクションと不一致になります。

  1. #トランザクション参加者が受信したメッセージの信頼性。

メッセージ ミドルウェアと

トランザクション参加者 は、メッセージを 正常に消費できることを保証する必要があります。

    メッセージの繰り返し消費

  1. トランザクション参加者、メッセージ参加者の
インターフェイス冪等性

問題に注意してくださいメッセージは正常に消費された可能性がありますが、ネットワークの問題により、メッセージ ミドルウェアはメッセージが消費されなかったと判断し、再試行を開始しました。 <h4 data-tool="mdnice编辑器" style="margin-bottom: 15px;font-weight: bold;color: black;font-size: 18px;margin-top: 30px;"> <span style="display: none;">#解決策</span><span style="display: none;"></span> </h4> <ol class="list-paddingleft-2" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;"><li>ローカル メッセージ テーブル<section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><br></section> </li></ol>ローカル メッセージ テーブル重要なのは、メッセージ ログを保存するローカル レコード テーブルがあることです。メッセージが送信できることを確認するには、スケジュールされたタスクを開始してメッセージ ログ レコードを継続的にスキャンする必要があります。具体的なプロセスは次のとおりです: <p data-tool="mdnice编辑器" style="padding-bottom: 8px;padding-top: 1em;color: rgb(74, 74, 74);line-height: 1.75em;"></p> <p style="text-align: center;"><img src="https://img.php.cn/upload/article/001/273/727/466f73efb910daa6fc9aa2bee5ae1012-2.png" alt="分散トランザクション: 信頼性の高いメッセージの結果整合性スキーム" ></p>上の図のプロセス: <p data-tool="mdnice编辑器" style="max-width:90%"><br></p> <blockquote data-tool="mdnice编辑器" style="border-top: none;border-right: none;border-bottom: none;font-size: 0.9em;overflow: auto;background: rgb(251, 249, 253);color: rgb(106, 115, 125);margin-bottom: 20px;margin-top: 20px;padding: 15px 20px;line-height: 27px;border-left-color: rgb(53, 179, 120);">1) トランザクション開始者のローカル トランザクションが正常に実行され、ローカル メッセージ テーブルにメッセージがログに記録されます。 <p style="line-height: 26px;font-size: 15px;color: rgb(89, 89, 89);">2) スケジュールされたタスクを開始し、ローカル メッセージ テーブルを周期的にスキャンします。 <br>3) スケジュールされたタスクはメッセージをスキャンし、メッセージをメッセージ ミドルウェアに送信します。 <br>4) メッセージミドルウェアはメッセージを受信し、成功メッセージを返してトランザクション開始者に通知します。 <br>5) トランザクション開始者は、メッセージを受信して​​正常に送信した後、ログ メッセージを削除します。 <br>6) トランザクション参加者はメッセージを購読し、メッセージを消費します。 <br>7) トランザクション参加者はローカル トランザクションを処理します。 <br>8) ローカル トランザクションは正常に処理され、成功した ACK がメッセージ ミドルウェアに送信されます。 <br><br></p> </blockquote>注意事項:<p data-tool="mdnice编辑器" style="padding-bottom: 8px;padding-top: 1em;color: rgb(74, 74, 74);line-height: 1.75em;"><br>トランザクション参加者はインターフェイスの冪等性を保証します<code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(40, 202, 113);'>。

  1. RocketMq トランザクション メッセージ スキーム

Apache

RocketMQ 4.3 以降のバージョンは、 トランザクション メッセージ # を正式にサポートします## は、分散トランザクションの実装に便利なサポートを提供します。 RocketMQ 4.3 以降、完全なトランザクション メッセージが実装されました。実際、これはローカル メッセージ テーブルの an encapsulation です。ローカル メッセージ テーブルは、次の問題を解決するために MQ 内部 に移動されました。プロデューサー側でのメッセージの送信と処理 ローカル トランザクション実行の atomicity の問題。

実装プロセス:

1) トランザクション開始者は Half トランザクション メッセージを送信します
2) RocketMq は Halfsent success# を応答します##3) トランザクション開始者はローカル トランザクションを実行します。
4) トランザクション開始者はローカル トランザクションを正常に実行し、RocketMq にコミットを送信し、mq はトランザクション参加者にメッセージを配信します。トランザクション開始者はローカル トランザクションの実行に失敗し、
rollbackRocketMq に移動し、mq delete メッセージを送信します。 5) RocketMq は、一定期間内にトランザクション開始者から確認情報を受信しない場合、トランザクション開始者に対して
トランザクション レビューを行います。 6) トランザクション開始者は、ローカル トランザクションのステータスを問い合わせます。
7) トランザクション開始者は、クエリされたトランザクション ステータスに基づいて
commint/rollback を RocketMq に送信します。 8) RocketMq が
commit を開始して失敗を受信した場合、または一定期間内に成功した ACK を受信しなかった場合、再試行が開始されます。

利点:

メッセージ データは独立して保存されるため、ビジネス システムとメッセージ システム間の結合が軽減されます。

スループットは、ローカル メッセージ テーブル ソリューションよりも優れています。

欠点:

1 つのメッセージ送信には 2 つのネットワーク リクエスト (ハーフ メッセージ コミット/ロールバック) が必要です。

メッセージレビューインターフェイスを実装する必要があります。

実際には、各分散トランザクション ソリューションには長所と短所があり、長所と短所を比較検討して、ビジネス シナリオに最も適したものを選択する必要があります。

以上が分散トランザクション: 信頼性の高いメッセージの結果整合性スキームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はJava后端技术全栈で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。