什么是保持持久队列及其绑定但暂停消费者的最佳方法?
使用情况是:如果我们不断收到一堆无法处理的消息(例如数据库宕机或模式问题),我希望“让它崩溃”并停止处理消息,但仍想继续聚合到队列中。即允许发布但挂起消费。
我可以想到三种解决方案:
1. 我可以让所有绑定到队列的消费者持续拒绝消息并重新排队,但这有点浪费资源,更不用说我必须编程执行上述逻辑。 2. 我可以调用所有消费者的
使用情况是:如果我们不断收到一堆无法处理的消息(例如数据库宕机或模式问题),我希望“让它崩溃”并停止处理消息,但仍想继续聚合到队列中。即允许发布但挂起消费。
我可以想到三种解决方案:
1. 我可以让所有绑定到队列的消费者持续拒绝消息并重新排队,但这有点浪费资源,更不用说我必须编程执行上述逻辑。 2. 我可以调用所有消费者的
basic.cancelConsumer
(见下文)
3. 或者在spring-amqp方面,我猜我可以调用绑定到队列的所有SimpleMessageListenerContainers上的shutdown
。
#1
我们已经在处理中被拒绝的消息。问题是这就像一个无限循环的失败,如果您记录了这个失败,那么会浪费更多的资源。
#3
看起来很理想,但我必须知道所有消息侦听器并通知它们关闭。我想我可以使用扇出交换机来通知队列需要暂停。我觉得RabbitMQ一定有内置的逻辑来处理这个问题。另一个问题是您可以将多个队列绑定到一个消息容器(可能不需要暂停所有队列)。
对于#2
,我知道我可以使用其consumerTag
取消消费者,但问题是(假设这是正确的方法),我从哪里获取与队列相关的consumerTag
列表?