【发布时间】:2012-03-26 14:39:30
【问题描述】:
如果我的理解是正确的,您实际上不能在不将它们取出并放回它们的情况下查看兔子队列中的消息。没有办法使用 rabbitmqctl 来检查队列。
在某些调试上下文中,了解当前队列中的内容非常有用。有没有办法获取消息?另外,Rabbit 的设计是什么让这个过程变得繁琐?
【问题讨论】:
标签: rabbitmq
如果我的理解是正确的,您实际上不能在不将它们取出并放回它们的情况下查看兔子队列中的消息。没有办法使用 rabbitmqctl 来检查队列。
在某些调试上下文中,了解当前队列中的内容非常有用。有没有办法获取消息?另外,Rabbit 的设计是什么让这个过程变得繁琐?
【问题讨论】:
标签: rabbitmq
管理 API 中的每个队列都有一个“获取消息”部分。然而,这会导致消息被消耗,因此是一种破坏性的行为。我们只能以牺牲消息的顺序为代价将这条消息重新排队到队列中[对于 rabbitmq 版本
一个更可行的替代方法是使用 firehose 跟踪器,http://www.rabbitmq.com/firehose.html [对于 rabbitmq 版本> 2.5]。这实际上将消息发布到不同的交换 (amq.rabbitmq.trace) 只是为了调试目的。
这是另一个在 firehose 之上编写的 GUI,以提高可见性,http://www.rabbitmq.com/blog/2011/09/09/rabbitmq-tracing-a-ui-for-the-firehose/
【讨论】:
您当然可以在 RabbitMQ 或任何 AMQP 代理中查看队列的内容。只消费消息但不承认它们。关闭频道后,您的“真实”消费者将可以使用这些消息。请记住,这样做可能会影响您检查的队列中消息的顺序。
此外,RabbitMQ 提供的 Web 管理插件允许您从 Web 界面查看消息的内容。如果您正在尝试调试系统,这是一个非常有用的工具。
【讨论】:
我还没有亲自使用过,但是我看到了 RabbitMQ 的管理插件,我认为它可以让你监控队列。
【讨论】:
【讨论】:
在将它们发送到 RabbitMQ 之前,您可以先将它们填充到其他东西中。我写了消息队列软件来做到这一点。查看http://qdb.io/
【讨论】:
没有健全的方法来查看队列,但也许监控进入的内容就足够了。为此,您需要实现一个中间人监视器。这需要合作的客户端:您需要教所有发送者或所有接收者使用不同的交换。
假设您要监视消息以交换“foo”。您创建一个名为“foo-in”(或其他)的(直接)交换,将“foo”设置为“foo-in”的备用交换,并教所有发件人将他们的消息发送到“foo-in”交换而不是“foo”。
然后,您的队列监视器需要监听“foo-in”,并将所有消息重新发布到“foo”。每当监视器不运行时,rabbitmq 会自行将它们路由到“foo”;对此的性能损失可以忽略不计。
这是一个 rabbitmq 扩展。有关备用交换如何工作的详细信息,请参阅http://www.rabbitmq.com/ae.html。当然,您可以分别使用“foo”和“foo-out”,如果在您的设置中这样做更容易的话。
监控特定队列(同样:队列输入,而不是输出)更容易,但同样需要更改客户端(或创建队列的代码,如果它们是持久的)。设置一个扇出交换,将客户端的队列绑定到该交换,然后将交换绑定到原始消息源。这是另一个 rabbitmq 扩展;见http://www.rabbitmq.com/e2e.html。您的监视器只需要绑定到该交换,并将获取发送到客户端队列的所有消息的副本。
【讨论】:
可以在不确认的情况下获取消息然后拒绝它,这不会将消息从队列中取出。 但这并没有在管理工具中实现。
而且消息在被释放之前被锁定,这意味着在它被拒绝之前没有其他消费者可以使用它。
【讨论】:
您可以使用队列查看器 (https://www.queueviewer.com)。需要开启 RabbitMQ 的管理插件。
【讨论】: