RabbitMQ暂停队列消费

10
什么是保持持久队列及其绑定但暂停消费者的最佳方法?
使用情况是:如果我们不断收到一堆无法处理的消息(例如数据库宕机或模式问题),我希望“让它崩溃”并停止处理消息,但仍想继续聚合到队列中。即允许发布但挂起消费。
我可以想到三种解决方案:
1. 我可以让所有绑定到队列的消费者持续拒绝消息并重新排队,但这有点浪费资源,更不用说我必须编程执行上述逻辑。 2. 我可以调用所有消费者的basic.cancelConsumer(见下文) 3. 或者在方面,我猜我可以调用绑定到队列的所有SimpleMessageListenerContainers上的shutdown

#1 我们已经在处理中被拒绝的消息。问题是这就像一个无限循环的失败,如果您记录了这个失败,那么会浪费更多的资源。

#3 看起来很理想,但我必须知道所有消息侦听器并通知它们关闭。我想我可以使用扇出交换机来通知队列需要暂停。我觉得RabbitMQ一定有内置的逻辑来处理这个问题。另一个问题是您可以将多个队列绑定到一个消息容器(可能不需要暂停所有队列)。

对于#2,我知道我可以使用其consumerTag取消消费者,但问题是(假设这是正确的方法),我从哪里获取与队列相关的consumerTag列表?

2个回答

3
如果你需要停止一个消费者,只需调用基本的取消操作即可。
持久化队列是在声明队列时解决的问题:durable=true auto_delete=false
持久化消息是在发布它们时确定的:delivery_mode=2
每个消费者都有自己的消费者标签。无论何时从队列中获取一条消息,信封都应该有消费者标签,并且你应该使用该标签调用基本取消操作。
据我所知,你不能在连接1中拥有消费者A并在不同的连接上调用该消费者的基本取消操作。我可能在这一点上错了。

谢谢。我知道如何在兔子中声明队列,就像上面那样。看起来我将不得不自己管理消费者,这是我已经走下的路。如果兔子有管理方面暂停队列消费的选项会很好。 - Adam Gent
你唯一能从连接中做的就是从管理员强制关闭它,这并不是你想要的。 - old_sound

2
这个解决方案是特定于 的。它基本上是我回答中的第 #3
我维护一个服务,其中包含一个队列名称到自定义扩展的 SimpleMessageListenerContainerMap<String,CustomSimpleMessageListenerContainer>
在发生一定数量的异常后,我会发送一个“紧急情况”消息,该消息发送到由服务接收以关闭消费者的特殊队列。

带有次要队列的“panic”是一个不错的想法! - watery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接