web-dev-qa-db-ja.com

RabbitMQとメッセージの優先度

RabbitMQにはメッセージ優先度の概念がありますか?私は、キューの前にある重要度の低いメッセージのために、いくつかのより重要なメッセージの速度が低下しているという問題を抱えています。優先度の高いものが優先され、キューの先頭に移動するのが大好きです。

「高速」キューと「低速」キューの2つのキューを使用してこれを概算できることは知っていますが、それはハックのようです。

RabbitMQを使用したより良いソリューションを知っている人はいますか?

32
Kelly

この質問に対する答えは古くなっています。 RabbitMQ 3.5.0の時点で、AMQP標準のメッセージごとの優先度のインコアサポートがあります。 ドキュメント にはすべての詳細がありますが、要するに:

  • キューの作成時にキューの優先度の範囲を定義する必要があります。
  • 優先度が設定されていないメッセージの優先度は0になります。
  • キューに設定されている最大値よりも高い数値の優先度を持つメッセージは、キューがサポートする最高の優先度を取得します。

より興味深い警告はドキュメントにあります。それらを読む価値は十分にあります。

56
womble

うさぎには、ブライアンが簡潔に言うように、優先順位の概念はありません。前のほうが先に到着します。 ;-)

特定のメッセージングのニーズに対応するキューのセットを実装し、これらのキューに「MyQueueP1」、「MyQueueP2」などを呼び出して優先順位付けのニーズをモデル化し、次に消費者にP1をチェックさせることをお勧めしますP2(など)およびサービスメッセージの前に最初に。

その後、優先度の高いメッセージがある場合は、適切なルーティングキーと出来事によって適切な優先度キューにメッセージを発行します。

[更新]この質問を確認してください: a FIFO Qeueingシステムで、優先メッセージングを実装する最良の方法は何ですか

[更新]最近のRabbitMQリリース3.5.0によると、この回答は現在古くなっており、このリリースより前のバージョンでのみ有効と見なされる必要があります。 https://stackoverflow.com/a/29068288/489888

20
Steve Martin

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はそれを実装する必要があると思いますが、ドキュメントを参照してください。

10
vanza

はい、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());
2
Liquidpie

https://www.rabbitmq.com/community-plugins.html からプラグインrabbitmq_priority_queueをインストールすることにより、rabbitmqを分散優先キューにすることができます。プラグインrabbitmq_priority_queue-3.3.x-72d20292.ezをダウンロードし、ウサギmqインストールディレクトリのpluginsフォルダー内に配置する必要があります。サーバーを再起動します。これで、アイテムを優先度付きでキューに挿入し、それに応じて消費することができます。サンプルコードを RabbitMQをポーリングして優先度順にメッセージを取得する方法 に貼り付けました。

0
Ranjith