私はRabbitMQサーバーを使用し、 すぐ フィールドが設定されました 本当 、私は50,000メッセージを送信して使用してみました rabbitmqctl list_queues、キュー内のメッセージの数が ゼロ。その後、私は変更しました すぐ フラグを立てる false 再度50,000メッセージを送信してから、 rabbitmqctl list_queues 合計100,000のメッセージがキューにあることがわかりました(これまで、コンシューマーは存在していませんでした)
その後、コンシューマーを開始し、100,000件のメッセージをすべて消費しました。 すぐ ビットフィールドとこの動作も。また、私はの概念を理解することができませんでした 必須の ビットフィールド。
よろしくお願いします。
ガープリット・シン。
immediate
およびmandatory
フィールドはAMQP仕様の一部であり、RabbitMQ FAQ)でもカバーされており、その実装者がどのように意味を解釈したかを明確にします。
このフラグは、メッセージをキューにルーティングできない場合の対応方法をサーバーに通知します。具体的には、必須が設定されており、バインディングの実行後にメッセージがゼロのキューに配置された場合、メッセージは送信者に返されます(basic.returnを使用)。同じ状況で必須が設定されていなかった場合、サーバーはメッセージを通知せずにドロップします。
または、「このメッセージを少なくとも1つのキューに入れます。それができない場合は、私に返信してください。」
即時セットでパブリッシュされたメッセージの場合、一致するキューに準備ができたコンシューマーがある場合、それらの1つにメッセージがルーティングされます。幸運なコンシューマーが受信確認を行う前にクラッシュした場合、メッセージは再度キューに入れられるか、そのキューの他のコンシューマーに配信されます(クラッシュが発生しない場合、メッセージは確認され、すべて通常どおりに実行されます)。ただし、一致するキューの準備ができているコンシューマがゼロの場合、メッセージはそのキューからの後続の再配信のためにエンキューされません。一致するすべてのキューに準備ができたコンシューマーがない場合にのみ、メッセージは(basic.returnを介して)送信者に返されます。
あるいは、「キューに接続されているコンシューマが1つでもいて、今すぐメッセージを配信できる場合は、このメッセージをすぐに配信します。接続されているコンシューマがない場合その後、私のメッセージを後で消費しても意味がなく、彼らはそれを見ることができません。彼らはスヌーズし、彼らは失います。」
http://www.rabbitmq.com/blog/2012/11/19/breaking-things-with-rabbitmq-3-0/
「即時」フラグの削除
変更点 AMQPのbasic.publishで、ほとんど使用されない「即時」フラグのサポートを削除しました。
いったいなぜそれをしたのですか?「即時」のサポートにより、コードベースの多くの部分、特にミラーリングされたキューの周りがより複雑になりました。また、ミラーリングされたキューでパフォーマンスを大幅に向上させることができなかったのも問題でした。
何をする必要がありますか?メッセージがすぐに消費されない場合にドロップされるメッセージを公開できるようにしたい場合は、TTLを使用してキューに公開できます。の0。
これが発生したことをパブリッシャーが判断できるようにする必要がある場合は、DLX機能を使用して、そのようなメッセージを別のキューにルーティングし、そこからパブリッシャーがメッセージを消費することもできます。
クイックリファレンスとしてここにアナウンスをコピーしました。