Каков наилучший способ сохранить устойчивую очередь и ее привязки, но приостановить ее потребителей?
Вариант использования: я хотел бы «дать ему сбой» и прекратить обработку сообщений, если мы продолжаем получать кучу сообщений, с которыми мы не можем справиться (например, база данных не работает или проблема со схемой), но хотел бы продолжать агрегировать в очередь. То есть разрешить публикацию, но приостановить потребление.
Я могу придумать три решения:
- Я мог бы заставить всех потребителей, привязанных к очереди, постоянно отклонять сообщения и повторно ставить их в очередь, но это своего рода пустая трата ресурсов, не говоря уже о том, что я программно выполняю вышеуказанную логику.
- Я мог бы вызвать
basic.cancelConsumer
для всех потребителей (см. ниже) - Или с точки зрения spring-amqp Думаю, я мог бы вызвать
shutdown
для всех SimpleMessageListenerContainer, привязанные к очереди.
#1
мы уже делаем, так как сообщения отклоняются. Проблема в том, что в конечном итоге это похоже на бесконечный цикл сбоев, и если вы регистрируете этот сбой, еще больше ресурсов тратится впустую.
#3
кажется идеальным, но мне нужно как-то узнать обо всех прослушивателях сообщений, а затем уведомить их о завершении работы. Я полагаю, что мог бы использовать разветвленный обмен, чтобы уведомить о том, что очередь должна быть приостановлена. Я чувствую, что RabbitMQ должен иметь что-то встроенное для этой логики. Другая проблема заключается в том, что вы можете привязать несколько очередей к контейнеру сообщений (не все очереди могут нуждаться в приостановке).
Для #2
я знаю, что могу отменить потребителя с его consumerTag
, но вопрос (при условии, что это правильный способ сделать вышеизложенное) заключается в том, где мне получить список consumerTag
s в очередь?