RabbitMQにはメッセージ優先度の概念がありますか?私は、キューの前にある重要度の低いメッセージのために、いくつかのより重要なメッセージの速度が低下しているという問題を抱えています。優先度の高いものが優先され、キューの先頭に移動するのが大好きです。
「高速」キューと「低速」キューの2つのキューを使用してこれを概算できることは知っていますが、それはハックのようです。
RabbitMQを使用したより良いソリューションを知っている人はいますか?
この質問に対する答えは古くなっています。 RabbitMQ 3.5.0の時点で、AMQP標準のメッセージごとの優先度のインコアサポートがあります。 ドキュメント にはすべての詳細がありますが、要するに:
より興味深い警告はドキュメントにあります。それらを読む価値は十分にあります。
うさぎには、ブライアンが簡潔に言うように、優先順位の概念はありません。前のほうが先に到着します。 ;-)
特定のメッセージングのニーズに対応するキューのセットを実装し、これらのキューに「MyQueueP1」、「MyQueueP2」などを呼び出して優先順位付けのニーズをモデル化し、次に消費者にP1をチェックさせることをお勧めしますP2(など)およびサービスメッセージの前に最初に。
その後、優先度の高いメッセージがある場合は、適切なルーティングキーと出来事によって適切な優先度キューにメッセージを発行します。
[更新]この質問を確認してください: a FIFO Qeueingシステムで、優先メッセージングを実装する最良の方法は何ですか
[更新]最近のRabbitMQリリース3.5.0によると、この回答は現在古くなっており、このリリースより前のバージョンでのみ有効と見なされる必要があります。 https://stackoverflow.com/a/29068288/489888
IIRC RabbitMQは、AMQPプロトコルバージョン0.9.1を引き続き使用します(仕様を取得します here )。仕様には間違いなくメッセージの優先度が記載されています。
Messages may have a priority level. A high priority message is sent ahead of lower priority messages
waiting in the same message queue. When messages must be discarded in order to maintain a specific
service quality level the server will first discard low-priority messages.
そして:
Note that in the presence of multiple readers from a queue, or client transactions, or use of priority fields,
or use of message selectors, or implementation-specific delivery optimisations the queue MAY NOT
exhibit true FIFO characteristics.
仕様では優先度は必須であると書かれているため、RabbitMQはそれを実装する必要があると思いますが、ドキュメントを参照してください。
はい、RabbitMQは優先度キューをサポートしています。
キューを優先キューとして機能させるには、プロパティx-max-priority
キューを宣言するとき。
プロパティx-max-priority
は、キューがサポートする最大優先順位番号を定義します。
Javaでは、次のようにできます。
Map<String, Object> props = new HashMap<>();
props.put("x-max-priority", 10); // max priority number as 10
channel.queueDeclare(QUEUE_NAME, durable, false, false, props);
特定の優先度のメッセージを公開するには、次のようにします。
String message = "My message with priority 7";
AMQP.BasicProperties.Builder basicProps = new AMQP.BasicProperties.Builder();
basicProps.contentType("text/plain")
.priority(7);
channel.basicPublish("", QUEUE_NAME, basicProps.build(), message.getBytes());
https://www.rabbitmq.com/community-plugins.html からプラグインrabbitmq_priority_queueをインストールすることにより、rabbitmqを分散優先キューにすることができます。プラグインrabbitmq_priority_queue-3.3.x-72d20292.ezをダウンロードし、ウサギmqインストールディレクトリのpluginsフォルダー内に配置する必要があります。サーバーを再起動します。これで、アイテムを優先度付きでキューに挿入し、それに応じて消費することができます。サンプルコードを RabbitMQをポーリングして優先度順にメッセージを取得する方法 に貼り付けました。