【问题标题】:RabbitMQ - Removed unacked messages on a queue that does not have any consumersRabbitMQ - 删除没有任何消费者的队列上未确认的消息
【发布时间】:2018-09-25 19:19:25
【问题描述】:

我们在 RabbitMQ 中有一个备份队列,它只是保留旧消息的副本以供人类使用。此队列中没有消费者,查看消息的唯一方法是使用 Get Messages UI/API。

问题是其中一位用户尝试在启用重新队列的情况下获取超过 24k 条消息,并且队列进入了错误状态。

目前我看到有 24k 未确认消息,但队列中没有任何消费者。

此时我要做的就是清除队列以删除旧消息,但我无法清除未确认的消息。而且由于没有消费者,我不知道我可以关闭任何连接,这会将消息移回就绪状态。

我可以执行任何管理员操作来清空此队列的内容吗? 如果没有,此时我可以做些什么来将消息移回就绪状态?

编辑:关于这个主题的其他类似问题都有消费者,而我没有,所以他们的解决方案不适用于我。因此,我为什么要将此作为一个新问题来创建。

谢谢

RabbitMQ Screenshot of Unacked Messages

【问题讨论】:

  • 澄清一下——所有这些未确认的消息都是由于被传递到 Web 客户端而最终出现的?
  • 另外,一般来说,这不是 RabbitMQ 的有效用例。如果您想查看消息,请通过将它们保存到数据库来排空此队列,然后可以随意导航。
  • 嗨@theMayer,是的,没错,我们有两个队列(称它们为 q1 和 q1bkp)。我们向两者发送相同的消息,但 q1 有一个消费者接收消息并对其进行操作,而 q1bkp 没有消费者,因此人们可以手动查看数据。您关于数据库的观点是正确的,谢谢。我们只是没有这个,因为我们正在为客户开发一些软件,并且需要一种快速且简单的方式来检查我们的集成消息,而无需花费可计费的时间来建立基于数据库的工具。

标签: rabbitmq queue message


【解决方案1】:

我可以执行任何管理员操作来清空此队列的内容吗?

是的。只需删除并重新声明队列。管理控制台中应该有一个按钮可以为您执行此操作,然后您必须手动重新声明它并将其重新绑定到交易所。如果您担心丢失其他消息,可以在删除旧队列之前声明一个具有不同名称的新队列。

由于没有消费者,我不知道我可以关闭任何可以将消息移回就绪状态的连接。

这是一个艰难的过程。获取消息的管理命令应该立即“nack”消息以将其放回队列中(取决于设置)。这可能是一个错误,但您描述的用例(只是有一个没有消费者累积消息的队列)并不是一个真正有效的用例,所以即使它是一个错误,它也可能不是一个巨大的优先级有人工作。

注意未确认的消息与特定的频道相关联,而不是特定的消费者(我假设但不知道事实是,管理 API 的工作原理是在引擎盖下创建一个通道)。因此,也有可能通过关闭并重新启动管理插件,甚至可能是代理(尽管所有赌注都在那里)来重新排队。

来自this post,以下应该重新启动管理插件: rabbitmqctl eval 'application:stop(rabbitmq_management).' rabbitmqctl eval 'application:start(rabbitmq_management).'

【讨论】:

  • 谢谢你,@theMayer!这正是我需要知道的。我将尝试按照您建议的方式删除并重新创建队列。
  • 其实再想一想,在删除队列之前关闭管理插件听起来是个不错的选择。我的一个保留意见是,当我们的应用程序仍在运行时,我没有尝试这样做:您是否知道关闭管理插件是否会影响消息的传递或消耗? - 再次感谢您的回答。这正是我想要找出的。
最近更新 更多