メッセージキュー
このセクションでは、Apache RocketMQにおけるメッセージキューの定義、モデル関係、および内部属性について説明します。このトピックでは、メッセージキューのバージョン互換性情報と使用上の注意についても説明します。
定義
キューは、Apache RocketMQでメッセージを格納および送信するために使用されるコンテナです。キューは、Apache RocketMQメッセージの最小のストレージ単位です。
Apache RocketMQのトピックは、複数のキューで構成されています。これにより、キューは水平パーティショニングとストリーミングストレージをサポートします。
キューには、以下の利点があります。
順序付けされたストレージ: キューは本質的に順序付けられています。メッセージは、キューに入れられた順序と同じ順序で保存されます。最も古いメッセージはキューの先頭にあり、最新のメッセージはキューの末尾にあります。オフセットは、キュー内のメッセージの位置と順序を示すために使用されます。
ストリーミング操作セマンティクス: Apache RocketMQのキューベースのストレージを使用すると、コンシューマーはオフセットから1つ以上のメッセージを読み取ることができます。これにより、集計読み取りやバックトラック読み取りなどの機能を実装できます。これらの機能は、RabbitMQやActiveMQでは利用できません。
モデル関係
次の図は、Apache RocketMQのドメインモデルにおけるキューの位置を示しています。
デフォルトでは、Apache RocketMQは信頼性の高いメッセージストレージを提供します。正常に配信されたすべてのメッセージは、キューに永続的に保存されます。メッセージはプロデューサーによって送信され、コンシューマークライアントによって受信されます。各メッセージは、少なくとも1回は正常に配信できます。
Apache RocketMQのキューモデルは、Kafkaのパーティションモデルに似ています。Apache RocketMQでは、キューはトピックの一部です。メッセージはトピックによって管理されていても、キューで操作されます。たとえば、プロデューサーが特定のトピックにメッセージを送信する場合、メッセージはトピック内のキューに送信されます。
Apache RocketMQのキューの数を変更して、スケールアウトまたはスケールインできます。
内部属性
読み取りおよび書き込み権限
定義:現在のキューからデータの読み取りまたは書き込みが可能かどうか。
値:ブローカーによって定義されます。以下に列挙を示します。
6: 読み取りおよび書き込み。現在のキューに対してメッセージの書き込みと読み取りが可能です。
4: 読み取り専用。現在のキューからメッセージを読み取ることはできますが、書き込むことはできません。
2: 書き込み専用。現在のキューにメッセージを書き込むことはできますが、読み取ることはできません。
0: 読み取りまたは書き込みステータスが利用できません。現在のキューでは、読み取りまたは書き込み操作は許可されません。
- 制約:読み取りおよび書き込み権限はO&M操作に関連しています。権限を頻繁に変更しないことをお勧めします。
挙動の制約
各トピックは、メッセージを格納するために使用される1つ以上のキューで構成されています。各トピックのキューの数は、メッセージの種類とインスタンスが存在するリージョンに関連しています。キューの数を変更することはできません。
バージョン互換性
キュー名は、Apache RocketMQブローカーのバージョンによって異なります。以下に違いを示します。
ブローカーバージョン3.xおよび4.x: キュー名は、トピック名、ブローカーID、およびキューIDで構成され、物理ノードにバインドされます。
ブローカーバージョン5.x: キュー名は、クラスターによって割り当てられるグローバルに一意の文字列であり、物理ノードから切り離されています。
キュー名を構築したり、他の操作にバインドしたりしないことをお勧めします。そうしないと、ブローカーが更新されたときにキュー名を解決できない場合があります。
使用上の注意
キュー数の設定
トピックを作成または変更するときに、Apache RocketMQのキュー数を指定できます。少数のキューを設定し、不要なキューを追加しないことをお勧めします。
以下に、トピックに多数のキューが存在することによって発生する問題を示します。
- クラスター内のメタデータ量の増加 Apache RocketMQは、キューに基づいてメトリックとデータを収集および監視します。多数のキューは、メタデータの量が増加する可能性があります。
- クライアントの過負荷 Apache RocketMQでのメッセージの読み取りと書き込みは、キューに基づいて実行されます。多数のキューは、システム負荷を増加させる空のポーリングリクエストを生成する可能性があります。
キューを追加するシナリオ
物理ノードの負荷分散
Apache RocketMQの各トピックのキューは、異なるサービスノードに分散できます。クラスターのスケーリングアウト後にクラスターのトラフィックの負荷分散を確保するために、新しいサービスノードにキューを追加するか、以前のキューを移行することをお勧めします。
fifoメッセージに関連するパフォーマンスボトルネックの問題
Apache RocketMQブローカーバージョン4.xでは、fifoメッセージはキューでのみ有効になります。その結果、fifoメッセージの同時実行性はキューの数に基づいています。システムでパフォーマンスボトルネックの問題が発生した場合は、キューの数を増やすことをお勧めします。