順序メッセージは、送信された順序と同じ順序でコンシュームされます。最初に送信されたメッセージが最初のメッセージとしてコンシュームされ、次に送信されたメッセージは後でコンシュームされます。ほとんどの場合、順序メッセージは、メッセージを生成された順序でコンシュームする必要があるシナリオで使用されます。たとえば、順序メッセージは、金融証券やeコマースの分野で頻繁に使用されます。このトピックでは、RocketMQ for ApsaraMQにおける順序メッセージの用語、シナリオ、動作メカニズム、および使用上の注意について説明します。
順序メッセージとは
順序メッセージは、RocketMQ for ApsaraMQによって提供されるメッセージの種類です。このタイプのメッセージは、Topic 内で先入れ先出し(FIFO)の順序で公開およびコンシュームされます。最初に公開されたメッセージが最初のメッセージとしてコンシュームされます。
パーティション順序メッセージ
特定のTopic 内のメッセージは、シャーディングキーに基づいてパーティション化されます。各パーティション内のメッセージは、FIFO 順に公開およびコンシュームされます。 FIFO 順序は、同じパーティション内のメッセージにのみ適用されます。パーティションをまたがるメッセージは、FIFO 順にコンシュームする必要はありません。
シナリオ
パーティション順序メッセージは、高パフォーマンスが必要であり、各パーティション内のメッセージ(シャーディングキーを使用して区別される)をFIFO 順に公開およびコンシュームする必要があるシナリオに適しています。
例
ユーザー登録に確認コードが必要で、ユーザーIDをシャーディングキーとして使用する場合、同じユーザーから送信されたメッセージはFIFO 順に公開およびコンシュームされます。
eコマースの注文を作成するときに注文IDをシャーディングキーとして使用する場合、同じ注文の作成、支払い、および返金に関するメッセージはFIFO 順に公開およびコンシュームされます。
Alibaba グループ内のすべての社内 eコマースシステムは、パーティション順序メッセージを使用して、安定したパフォーマンスとオンライン注文の順次処理を保証しています。
動作メカニズム
このセクションでは、RocketMQ for ApsaraMQでメッセージの順序を確保する方法について説明します。
RocketMQ for ApsaraMQでメッセージがFIFO 順に送受信されるようにするには、次のフェーズに注意してください。
メッセージの公開
前の図では、注文 A と B のメッセージは、A1、B1、A2、A3、B2、B3 の順序で生成されます。同じ注文のメッセージは、生成された順序と同じ順序で送受信される必要があります。たとえば、注文 A のメッセージは、A1、A2、A3 の順序で送受信されます。注文 A の通常のメッセージは、ポーリングモードで異なるキューに送信される場合があります。通常のメッセージの元の順序は、キューに保持されません。RocketMQ for ApsaraMQでは、同じ注文 ID など、同じシャーディングキーを使用する順序メッセージは、同じキューに順番にルーティングされます。
RocketMQ for ApsaraMQ ブローカーは、プロデューサーがメッセージを送信する順序に基づいて、メッセージが生成される順序を決定します。RocketMQ for ApsaraMQ ブローカーは、異なるプロデューサーまたはスレッドによって並行して送信されたメッセージの順序を決定することはできません。
メッセージの保存
前の図に示すように、順序メッセージのTopic 内の各論理キューは、物理キューに対応しています。メッセージが論理キューに順番に送信されると、対応する物理キューに同じ順序で保存されます。
メッセージのコンシューム
RocketMQ for ApsaraMQは、メッセージを保存されている順序でコンシューマーに配信します。その後、コンシューマーは、最初に受信したメッセージからコンシュームします。
コンシューマーがメッセージをコンシュームする場合、同じシャーディングキーを含むメッセージは単一のスレッドを使用してコンシュームされます。これは、メッセージのコンシューム順序とメッセージの保存順序との整合性、およびメッセージのコンシューム順序とメッセージの公開順序との整合性を確保するのに役立ちます。
使用上の注意
各グループは Topic タイプに対応しています。グループを使用して、順序メッセージと順序なしメッセージの両方を送受信することはできません。
RocketMQ for ApsaraMQ ブローカーは、送信者が単一のプロデューサーまたはスレッドを使用してメッセージを送信する順序に基づいて、メッセージが生成される順序を決定します。送信者が複数のプロデューサーまたはスレッドを使用してメッセージを同時に送信する場合、メッセージの順序は、RocketMQ for ApsaraMQ ブローカーがメッセージを受信する順序によって決定されます。この順序は、ビジネス側の送信順序とは異なる場合があります。
よくある質問
1 つのメッセージが、順序メッセージ、スケジュールメッセージ、トランザクションメッセージになることはできますか?
いいえ。順序メッセージ、スケジュールメッセージ、トランザクションメッセージは異なるメッセージタイプであり、相互に排他的です。
順序メッセージはどのリージョンで使用できますか?
RocketMQ for ApsaraMQが利用可能なすべての Alibaba Cloud リージョンおよび Finance Cloud リージョンで、順序メッセージがサポートされています。
順序メッセージはどの伝送モードをサポートしていますか?
順序メッセージは、厳密なメッセージ順序を保証する信頼性の高い同期伝送モードのみをサポートしています。非同期伝送はサポートされていません。
順序メッセージは、クラスタリングコンシュームとブロードキャストコンシュームをサポートしていますか?
順序メッセージはクラスタリングコンシュームをサポートしていますが、ブロードキャストコンシュームはサポートしていません。
TCP SDK のサンプルコード
TCP 経由のメッセージングのサンプルコードについては、次のドキュメントを参照してください。
Java: 順序メッセージを送受信する
C/C++: 順序メッセージを送受信する
.NET: 順序メッセージを送受信する
HTTP SDK のサンプルコード
HTTP 経由のメッセージングのサンプルコードについては、次のドキュメントを参照してください。
Java: 順序メッセージを送受信する
Go: 順序メッセージを送受信する
Python: 順序メッセージを送受信する
Node.js: 順序メッセージを送受信する
PHP: 順序メッセージを送受信する
C#: 順序メッセージを送受信する
C++: 順序メッセージを送受信する