ApsaraMQ for RocketMQは、分散トランザクションメッセージをサポートします。 トランザクションメッセージは、最終的な一貫性が要求されるシナリオに適用される。 このトピックでは、ApsaraMQ for RocketMQトランザクションメッセージの概念、利点、シナリオ、対話プロセス、使用法のメモ、およびサンプルコードについて説明します。
用語
トランザクションメッセージ: ApsaraMQ for RocketMQは、X/Open XAと同様の分散トランザクション処理機能を提供し、ApsaraMQ for RocketMQでトランザクションの一貫性を確保します。
ハーフメッセージ: ハーフメッセージは一時的に配信できないメッセージです。 プロデューサーがApsaraMQ for RocketMQブローカーにメッセージを送信したが、ブローカーがプロデューサーから2回目の確認 (ACK) を受信しない場合、メッセージは「一時的に配信不能」とマークされます。 この状態のメッセージをハーフメッセージと呼ぶ。ApsaraMQ for RocketMQ
メッセージステータスチェック: トランザクションメッセージに対する第2のACKは、一時的な接続がネットワーク内で発生した場合、またはプロデューサアプリケーションが再起動された場合に失われる可能性がある。 ApsaraMQ for RocketMQブローカーが、メッセージが長期間ハーフメッセージとして残っていることを確認すると、ブローカーはプロデューサーにリクエストを送信して、メッセージの最終ステータスがコミットかロールバックかを確認します。
メリット
ApsaraMQ for RocketMQは、分散トランザクションメッセージを使用してアプリケーションを分離し、データの最終的な一貫性を確保します。 従来の大きなトランザクションは、小さなトランザクションに分割できます。 この操作は効率を改善する。 この操作は、アプリケーションで例外が発生したときにコアシステムの可用性も保証します。 アプリケーションがメッセージを受信できない場合は、すべてのメッセージをロールバックする必要なく、アプリケーションのデータのみを補足または修正できます。
シナリオ
ユーザが電子商取引アプリケーション上で自分のショッピングカートにアイテムを追加するとき、ショッピングカートシステムおよび取引システムが関与する。 分散トランザクションメッセージは、非同期処理することができる。 この操作により、2つのシステム間の最終的な一貫性が保証されます。 このシナリオでは、取引システムは非常に重要であり、分散トランザクション処理機能は注文が正常に行われたことを確認する必要があります。 ショッピングカートシステムは、ApsaraMQ for RocketMQからの注文に関連するトピックのみをサブスクライブし、対応するトランザクションを実行できます。 このように、分散トランザクション処理機能は、2つのシステム間の最終的な一貫性を保証することができる。
相互作用プロセス
次の図は、トランザクションメッセージの対話プロセスを示しています。
トランザクションメッセージを送信する手順には、次の手順が含まれます。
プロデューサーは、ハーフメッセージをApsaraMQ for RocketMQブローカーに送信します。
ApsaraMQ for RocketMQブローカーは、メッセージを永続的なメッセージに変換し、ACKをプロデューサに送信してメッセージが受信されたことを確認します。 この場合、メッセージはハーフメッセージである。
プロデューサは、ローカルトランザクションを実行する。
プロデューサは、ローカルトランザクションの実行結果を提出するために、ブローカに第2のACKを送信する。 実行結果は、コミットまたはロールバックの可能性があります。
ブローカによって受信されたメッセージのステータスがコミットである場合、ブローカは、半メッセージを配信可能としてマークし、メッセージを消費者に配信する。
ブローカによって受信されたメッセージのステータスがロールバックである場合、ブローカはトランザクションをロールバックし、半メッセージをコンシューマに配信しない。
ネットワークが切断されるか、またはプロデューサアプリケーションが再起動される。 この場合、ブローカーが第2のACKを受信しない場合、またはハーフメッセージのステータスが不明である場合、ブローカーは、ある期間待機し、ハーフメッセージのステータスを照会するために、プロデューサクラスタ内のプロデューサに要求を送信する。
トランザクションメッセージのステータスをチェックする手順を次に示します。
プロデューサは、リクエストを受信した後、ハーフメッセージに対応するローカルトランザクションの実行結果をチェックする。
プロデューサーは、ローカルトランザクションの実行結果に基づいて、ApsaraMQ forRocketMQブローカーに別のACKを送信します。 次いで、ブローカは、ステップ4に従うことによってハーフメッセージを処理する。
使用上の注意
メッセージを送信するためのルール
プロデューサーがブローカーにメッセージを送信してローカルトランザクションを実行すると、
execute
メソッドで次のいずれかの状態が返されます。TransactionStatus.CommitTransaction
: トランザクションはコミットされています。 消費者はメッセージを消費することができる。TransactionStatus.RollbackTransaction
: トランザクションはロールバックされます。 メッセージは破棄され、使用できません。TransactionStatus.Unknow
: トランザクションの状態が不明です。 一定期間が経過すると、ApsaraMQ for RocketMQブローカーはメッセージのステータスを確認するリクエストを送信します。
ONSCatory. createTransactionProducer
を呼び出してトランザクションメッセージのプロデューサーを作成するときは、LocalTransactionChecker
メソッドの実装クラスを指定する必要があります。 このようにして、例外が発生した場合、ブローカーはトランザクションメッセージのステータスをチェックできます。メッセージのステータスを確認するためのルール: ローカルトランザクションが実行された後、ApsaraMQ for RocketMQブローカーは、実行結果が
TransactionStatus.Unknow
であることを示すACKを受け取ります。 この場合、ApsaraMQ for RocketMQブローカーは、ローカルトランザクションの実行結果を確認するリクエストをプロデューサーに送信します。 ブローカーが結果を取得できない場合、ブローカーは指定された間隔でリクエストを送信します。チェック間隔: デフォルトでは、ブローカーは30秒ごとに12時間リクエストを送信し、ハーフメッセージのステータスを確認します。
新しく受信したハーフメッセージのステータスを確認するまでの待ち時間: このパラメーターはユーザー定義です。 ブローカが定期的なメッセージ状態チェックを開始する必要があるが、新たに受信されたハーフメッセージの状態がチェックされるまでの待ち時間が経過しない場合、ブローカはメッセージの状態をチェックしない。
次の例ではJavaを使用します。 この設定は、新たに受信したハーフメッセージの状態をチェックするまでの待ち時間が60秒であることを示している。
Message message = new Message(); message.putUserProperties(PropertyKeyConst.CheckImmunityTimeInSeconds、"60");
説明しかしながら、新たに受信されたメッセージのステータスがチェックされる前の実際の時間は、予想される時間より0〜30秒後である。 これは、ブローカーがデフォルトの間隔でメッセージステータスをチェックするためです。
たとえば、新しく受信したメッセージのステータスがチェックされるまでの待機時間を60秒に設定したが、ブローカーが新しいハーフメッセージを受信してから58秒後に定期チェックを開始した場合、メッセージはチェックされません。 30秒後、ブローカは、新しい半メッセージが受信された後、88秒目に別の定期チェックを開始する。 この場合、メッセージがチェックされます。 メッセージがチェックされる時間は、予想される時間より28秒遅れています。
メッセージを消費するためのルール
トランザクションメッセージは、他のタイプのメッセージとグループIDを共有できません。 トランザクションメッセージと他のタイプのメッセージの違いは、トランザクションメッセージがメッセージステータスチェックのメカニズムを提供することです。 ApsaraMQ for RocketMQブローカーは、グループIDでメッセージプロデューサーを照会できます。
サンプルコード
トランザクションメッセージを送信およびサブスクライブするためのさまざまなプログラミング言語のサンプルコードについては、次のトピックを参照してください。
TCP
Java SDKトランザクションメッセージの送受信
C/C ++ SDKトランザクションメッセージの送受信
. NET SDKトランザクションメッセージの送受信
HTTP
Go SDKトランザクションメッセージの送受信
Python SDKトランザクションメッセージの送受信
Node.js SDKトランザクションメッセージの送受信
PHP SDKトランザクションメッセージの送受信
Java SDKトランザクションメッセージの送受信
C ++ SDKトランザクションメッセージの送受信
C# SDKトランザクションメッセージの送受信