このトピックでは、ApsaraMQ for RabbitMQ で順序付きコンサンプションを実装する方法について説明します。また、オープンソースの RabbitMQ との違い、この機能の設定方法、およびその制限についても説明します。
メッセージの順序付きコンサンプションの仕組み
RabbitMQ で順序付きコンサンプションを実現するには、順序付きストレージと単一コンシューマーという 2 つの条件を満たす必要があります。
オープンソース RabbitMQ の実装
単一コンシューマー: オープンソースの RabbitMQ は、Single Active Consumer と Exclusive Consumer の 2 つのモードをサポートしています。オープンソースコミュニティでは、Single Active Consumer モードが推奨されています。
順序付きストレージ: オープンソースの RabbitMQ では、同じキュー内のメッセージは単一ノードで読み書きされます。これにより、メッセージが順序どおりに保存されることが本質的に保証されます。
ApsaraMQ for RabbitMQ での順序付きコンサンプションの実装
単一コンシューマー: ApsaraMQ for RabbitMQ は、オープンソースコミュニティで推奨されている Single Active Consumer モードをサポートしています。
順序付きストレージ: ApsaraMQ for RabbitMQ は、ストレージとコンピューティングを分離する分散アーキテクチャを使用しています。単一キュー内のメッセージは、複数のストレージノード上の複数のパーティションに分散されます。ただし、計算ノードはこれらのパーティションからメッセージを読み取り、マージソートを実行してから、コンシューマーに配信します。このプロセスにより、オープンソースバージョンと同じ順序付きコンサンプションのセマンティクスが実現されます。
ストレージとコンピューティングが分離された分散アーキテクチャでの順序付きコンサンプションの実装
前の図に示すように、Single Active Consumer モードのキューにはアクティブな接続が 1 つしかありません。他のすべての接続は非アクティブです。アクティブな接続を管理する計算ノードは、すべてのストレージノードからメッセージをプルし、メッセージをソートしてから、コンシューマーに配信します。
この場合、メッセージは計算ノードでソートされるため、計算ノードは一部のメッセージを一時的にキャッシュします。アクティブなコンシューマーが複数の計算ノードからメッセージを取得しようとすると、キャッシュされたメッセージは再キューイングされます。
ApsaraMQ for RabbitMQ のメリット
高い同時実行性とスケーラビリティ: ApsaraMQ for RabbitMQ は、マルチパーティションシステムで高い同時実行性でデータが書き込まれることを保証します。ApsaraMQ for RabbitMQ は、優れたスケールアウト機能も提供します。
高可用性: ApsaraMQ for RabbitMQ を使用すると、複数のコンシューマーが複数の計算ノードに接続して高可用性を実現できます。コンシューマーまたは計算ノードのいずれかに障害が発生した場合、システムはサービスを他のノードに迅速に切り替えることができます。
設定方法
順序付きコンサンプションを有効にするには、Single Active Consumer モードを使用するようにキューを設定します。キューを作成するときに、x-single-active-consumer パラメーターを true に設定します。
Single Active Consumer モードを有効にすると、ブローカーはメッセージをソートした後にコンシューマーにメッセージを配信します。これにより、メッセージのコンサンプション率が低下する可能性があります。このモードを有効にする前に、Single Active Consumer モードが必要かどうかを評価することをお勧めします。