RabbitMQ にはメッセージ優先度の概念がありますか? 重要度の低いメッセージがキューの前にあるために、重要度の高いメッセージの速度が低下しているという問題があります。優先度の高いものを優先して列の先頭に移動してほしいです。
「高速」キューと「低速」キューの 2 つのキューを使用してこれを概算できることはわかっていますが、それはハックのようです。
RabbitMQ を使用したより良い解決策を知っている人はいますか?
RabbitMQ にはメッセージ優先度の概念がありますか? 重要度の低いメッセージがキューの前にあるために、重要度の高いメッセージの速度が低下しているという問題があります。優先度の高いものを優先して列の先頭に移動してほしいです。
「高速」キューと「低速」キューの 2 つのキューを使用してこれを概算できることはわかっていますが、それはハックのようです。
RabbitMQ を使用したより良い解決策を知っている人はいますか?
この質問に対する回答は古くなっています。RabbitMQ 3.5.0 の時点で、AMQP 標準のメッセージごとの優先度がコア内でサポートされるようになりました。ドキュメントにはすべての面倒な詳細が含まれていますが、要するに:
ドキュメントには、より興味深い警告があります。それらを読む価値は十分にあります。
ブライアンが簡潔に述べているように、ウサギには優先順位の概念がありません。;-)
特定のメッセージング ニーズに対応する一連のキューを実装し、これらのキューで優先順位付けのニーズをモデル化して、たとえば「MyQueueP1」、「MyQueueP2」などと呼び、消費者に P1 をチェックさせることをお勧めします。 P2(など)の前に、そこからのサービスメッセージが最初に表示されます。
優先度の高いメッセージがある場合は、適切なルーティング キーを使用して、適切な優先度キューに発行します。
[更新] この質問を確認してください: FIFO キューイング システムでは、優先メッセージングを実装するための最良の方法は何ですか?
[更新] 最近の RabbitMQ リリース 3.5.0 によると、この回答は古くなっているため、このリリースより前のバージョンに対してのみ有効であると見なす必要があります。 https://stackoverflow.com/a/29068288/489888
IIRC RabbitMQ は、引き続き AMQP プロトコル バージョン 0.9.1 を使用します (仕様はこちらから入手してください)。仕様では、メッセージの優先度について明確に言及しています。
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 はそれを実装する必要があると思いますが、そのドキュメントを参照することをお勧めします。
https://www.rabbitmq.com/community-plugins.htmlからプラグイン rabbitmq_priority_queue をインストールすることで、rabbitmq を分散優先キューにすることができます。プラグイン rabbitmq_priority_queue-3.3.x-72d20292.ez をダウンロードして、rabbit mq インストール ディレクトリの plugins フォルダに入れる必要があります。サーバーを再起動します。これで、優先順位を付けてアイテムをキューに挿入し、それに応じて消費することができます。サンプル コードを「RabbitMQ をポーリングして優先順位の順序でメッセージを継続的に取得する方法」に貼り付けました。.
RabbitMQ / AMQP には間違いなくメッセージ優先度の概念があります。キューの先頭にあるメッセージはその後ろにあるメッセージよりも優先され、そのメッセージはその後ろにあるメッセージよりも優先され、というように無限に続きます。
そのモデルを変更できますか?いいえ!:)
優先順位付けを実装した場合、それは MQ ではありません。
MQ はデータ用の電子メールです。そして、すべてのデータ転送において、順序を維持することが不可欠です。順序を入れ替えると、挿入の前に削除が行われ、更新の順序が狂います。何も正しく動作しません。
有効な実装があるかもしれませんが、いくつかの例外がありますが、ほとんどの優先キューが設計されているのは、人々がシステム アーキテクチャとその中のパーツの相互作用について浅い考えを考えているためであることがわかりました。物事の順序を維持することは、ほとんどの場合、エンティティ内およびエンティティ間の相互作用の両方で正しいことです。
イベント A がイベント B よりも高い優先度を持つことができると言うには、2 つのイベントを常に分離する必要があります。そして、それが起こると、なぜそれらが同じキュー構造に存在するのか不思議に思うでしょう。繰り返しますが、ペイロードに関連する場合、そのペイロードの計算作業もシステムのパフォーマンスに影響を与えるため、ペイロードを作成する前に、より早く決定することが理にかなっています。