【问题标题】:Why can't you look at messages in the Rabbit Queue为什么不能查看 Rabbitmq Queue 中的消息
【发布时间】:2012-03-26 14:39:30
【问题描述】:

如果我的理解是正确的,您实际上不能在不将它们取出并放回它们的情况下查看兔子队列中的消息。没有办法使用 rabbitmqctl 来检查队列。

在某些调试上下文中,了解当前队列中的内容非常有用。有没有办法获取消息?另外,Rabbit 的设计是什么让这个过程变得繁琐?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    管理 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/

    【讨论】:

    • 如果这是您经常要做的事情,那么您可以自己做这件事 - 将您的 Exchange 发布到您的普通队列和一个辅助“监控”队列,该队列要么消耗所有消息并提供某种方式来查看它们,否则当队列变得太长或太旧时它们就会过期。
    【解决方案2】:

    您当然可以在 RabbitMQ 或任何 AMQP 代理中查看队列的内容。只消费消息但不承认它们。关闭频道后,您的“真实”消费者将可以使用这些消息。请记住,这样做可能会影响您检查的队列中消息的顺序。

    此外,RabbitMQ 提供的 Web 管理插件允许您从 Web 界面查看消息的内容。如果您正在尝试调试系统,这是一个非常有用的工具。

    【讨论】:

    • 啊,所以 Web 界面可以做到这一点。我想我得再看看它。谢谢。
    • 当然,但是这样做会吃掉有问题的信息。不是预期的结果。
    • @Matthias 如果你不确认他们就不会。
    • @BrianKelly 所以如果没有其他人捡起它们,你会再次得到它们。或者如果其他人先拿起它们,你会错过一些。两者都不符合我对“监视器”的定义。
    • @MatthiasUrlichs 问题和这个答案都没有提到“监视器”。
    【解决方案3】:

    我还没有亲自使用过,但是我看到了 RabbitMQ 的管理插件,我认为它可以让你监控队列。

    http://www.rabbitmq.com/management.html

    【讨论】:

    • 是的,而且非常有用!不幸的是,该工具主要提供汇总统计信息,并且没有查看队列中内容的机制(除非我弄错了)。
    • @archgoon 现在你让我更感兴趣了,因为我认为插件可以做到这一点。我查看了邮件列表,有些人正在为类似的东西构建插件 lists.rabbitmq.com/pipermail/rabbitmq-discuss/2011-March/… 我希望这存在,但如果功能不存在,我可能只是让我的程序将此数据作为快速查询写入 mysql 或文件,这样我就可以监视器。我希望有些东西存在,抱歉,我无法提供更多帮助。
    • 根据 Brian Kelly 的说法,您实际上可以从 Web 界面查看消息内容。我再去看看。
    • @archgoon 我也这么认为,但还没有开始测试它。很高兴看到你得到答案。我也学到了,谢谢!
    【解决方案4】:

    这是旧的,但仅适用于对此感兴趣的任何人。 通过访问Queues,您可以获得代理的所有队列列表。

    按您感兴趣的任何队列并向下滚动以找到此部分

    在这里设置的真正重要的选项是Requeue 选项。 如果设置为Yes,这个操作会消费消息,所以 你可以阅读它,但它会重新排队,所以它不会丢失。

    【讨论】:

    • 它不会丢失,但不幸的是它将被重新排队,因此消息的原始顺序(可能还有时间戳)将丢失
    • 不知道是这样的--好像requeue后把top message留在了顶部--我用这个界面先查看top message,然后requeue设置为no即可摆脱第一条消息。因此,也许“重新排队”实际上意味着在不确认的情况下获取它,然后通过销毁消费者将其恢复到就绪状态。
    • 官方文档说“当一条消息被重新排队时,如果可能的话,它将被放置到它在队列中的原始位置。如果不是(由于并发传递和多个消费者共享一个消息时来自其他消费者的确认)队列),消息将被重新排队到更接近队列头的位置。” rabbitmq.com/nack.html
    【解决方案5】:

    您可以先在 Web 管理中单击队列名称,然后单击 GetMessages 以获取您的消息。 现在它将在此处显示您的消息

    【讨论】:

      【解决方案6】:

      在将它们发送到 RabbitMQ 之前,您可以先将它们填充到其他东西中。我写了消息队列软件来做到这一点。查看http://qdb.io/

      【讨论】:

        【解决方案7】:

        没有健全的方法来查看队列,但也许监控进入的内容就足够了。为此,您需要实现一个中间人监视器。这需要合作的客户端:您需要教所有发送者或所有接收者使用不同的交换。

        假设您要监视消息以交换“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。您的监视器只需要绑定到该交换,并将获取发送到客户端队列的所有消息的副本。

        【讨论】:

        【解决方案8】:

        可以在不确认的情况下获取消息然后拒绝它,这不会将消息从队列中取出。 但这并没有在管理工具中实现。

        而且消息在被释放之前被锁定,这意味着在它被拒绝之前没有其他消费者可以使用它。

        【讨论】:

          【解决方案9】:

          您可以使用队列查看器 (https://www.queueviewer.com)。需要开启 RabbitMQ 的管理插件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-19
            • 1970-01-01
            • 2019-09-26
            • 1970-01-01
            • 2014-12-29
            • 2018-07-28
            • 1970-01-01
            • 2022-06-17
            相关资源
            最近更新 更多