耐久性のあるキューとそのバインディングを保持し、コンシューマーを一時停止する最良の方法は何ですか?
ユースケースは次のとおりです。「クラッシュさせて」、処理できないメッセージが大量に発生し続ける場合 (たとえば、データベースがダウンしている、またはスキーマの問題)、メッセージの処理を停止したいが、列。つまり、発行は許可されますが、消費は中断されます。
私は3つの解決策を考えることができます:
- キューにバインドされているすべてのコンシューマーに、メッセージを継続的に拒否して再キューイングさせることもできますが、これは、上記のロジックをプログラムで実行したことは言うまでもなく、一種の無駄なリソースです。
- すべての消費者を呼び出すことができます
basic.cancelConsumer
(以下を参照)。 - またはspring-amqpに関しては、キューにバインドされている
shutdown
すべてのSimpleMessageListenerContainersを呼び出すことができると思います。
#1
メッセージが拒否されているため、すでに行っています。問題は、これが失敗の無限 while ループのようになってしまい、その失敗をログに記録すると、さらに多くのリソースが無駄になることです。
#3
理想的なようですが、すべてのメッセージリスナーについて知ってから、シャットダウンするように通知する必要があります。ファンアウト交換を使用して、キューを一時停止する必要があることを通知できると思います。このロジックには、RabbitMQ に何かが組み込まれている必要があるように感じます。もう 1 つの問題は、複数のキューをメッセージ コンテナーにバインドできることです (すべてのキューを一時停止する必要があるわけではありません)。
#2
私はそれで消費者をキャンセルできることを知っていますがconsumerTag
、質問は(それが上記を行う正しい方法であると仮定して)どこでconsumerTag
s のリストをキューに取得するのですか?