web-dev-qa-db-ja.com

RabbitMQでの即時ビットと必須ビットの使用

私はRabbitMQサーバーを使用し、 すぐ フィールドが設定されました 本当 、私は50,000メッセージを送信して使用してみました rabbitmqctl list_queues、キュー内のメッセージの数が ゼロ。その後、私は変更しました すぐ フラグを立てる false 再度50,000メッセージを送信してから、 rabbitmqctl list_queues 合計100,000のメッセージがキューにあることがわかりました(これまで、コンシューマーは存在していませんでした)

その後、コンシューマーを開始し、100,000件のメッセージをすべて消費しました。 すぐ ビットフィールドとこの動作も。また、私はの概念を理解することができませんでした 必須の ビットフィールド。

よろしくお願いします。

ガープリット・シン。

52
Gurpreet Singh

immediateおよびmandatoryフィールドはAMQP仕様の一部であり、RabbitMQ FAQ)でもカバーされており、その実装者がどのように意味を解釈したかを明確にします。

必須

このフラグは、メッセージをキューにルーティングできない場合の対応方法をサーバーに通知します。具体的には、必須が設定されており、バインディングの実行後にメッセージがゼロのキューに配置された場合、メッセージは送信者に返されます(basic.returnを使用)。同じ状況で必須が設定されていなかった場合、サーバーはメッセージを通知せずにドロップします。

または、「このメッセージを少なくとも1つのキューに入れます。それができない場合は、私に返信してください。」

即時

即時セットでパブリッシュされたメッセージの場合、一致するキューに準備ができたコンシューマーがある場合、それらの1つにメッセージがルーティングされます。幸運なコンシューマーが受信確認を行う前にクラッシュした場合、メッセージは再度キューに入れられるか、そのキューの他のコンシューマーに配信されます(クラッシュが発生しない場合、メッセージは確認され、すべて通常どおりに実行されます)。ただし、一致するキューの準備ができているコンシューマがゼロの場合、メッセージはそのキューからの後続の再配信のためにエンキューされません。一致するすべてのキューに準備ができたコンシューマーがない場合にのみ、メッセージは(basic.returnを介して)送信者に返されます。

あるいは、「キューに接続されているコンシューマが1つでもいて、今すぐメッセージを配信できる場合は、このメッセージをすぐに配信します。接続されているコンシューマがない場合その後、私のメッセージを後で消費しても意味がなく、彼らはそれを見ることができません。彼らはスヌーズし、彼らは失います。」

114
Brian Kelly

http://www.rabbitmq.com/blog/2012/11/19/breaking-things-with-rabbitmq-3-0/

「即時」フラグの削除

変更点 AMQPのbasic.publishで、ほとんど使用されない「即時」フラグのサポートを削除しました。

いったいなぜそれをしたのですか?「即時」のサポートにより、コードベースの多くの部分、特にミラーリングされたキューの周りがより複雑になりました。また、ミラーリングされたキューでパフォーマンスを大幅に向上させることができなかったのも問題でした。

何をする必要がありますか?メッセージがすぐに消費されない場合にドロップされるメッセージを公開できるようにしたい場合は、TTLを使用してキューに公開できます。の0。

これが発生したことをパブリッシャーが判断できるようにする必要がある場合は、DLX機能を使用して、そのようなメッセージを別のキューにルーティングし、そこからパブリッシャーがメッセージを消費することもできます。

クイックリファレンスとしてここにアナウンスをコピーしました。

7
themefield