【问题标题】:RabbitMQ Queued messages keep increasingRabbitMQ 排队的消息不断增加
【发布时间】:2015-07-31 09:38:45
【问题描述】:

我们有一个基于 Windows 的 Celery/RabbitMQ 服务器,它为我们的 Web 应用程序在进程外执行长时间运行的 python 任务。
例如,它的作用是获取一个 CSV 文件并处理每一行。对于每一行,它都会在我们的数据库中预订一条或多条记录。

这似乎工作正常,我可以看到工作进程正在预订的记录。但是,当我使用管理插件(基于 Web 的管理工具)检查 rabbitMQ 服务器时,我看到排队的消息在增加,并且没有回来。

在连接下,我看到 116 个连接,每个虚拟主机大约 10-15 个,全部“运行”,但是当我单击时,它们中的大多数都将“空闲”作为状态。 我也想知道为什么这些连接仍然打开,如果有什么我需要改变以使它们自己关闭:

在“队列”下,我可以看到超过 6200 个状态为“空闲”的项目,并且没有减少。

所以具体来说,我在问这些是否是正常的统计数据,或者我是否应该担心队列增加但不会恢复,以及似乎没有关闭的持久连接......

除了管理工具中相当简洁的帮​​助外,我似乎找不到任何关于这些统计数据的含义以及它们是好还是坏的信息。

我还想知道为什么消息在队列中仍然可见,以及为什么它们没有被删除,因为任务似乎没有很好地完成。

感谢任何帮助。

【问题讨论】:

  • 您是否发送回 Ack 以确认消息已被处理?虽然连接可能会保留,但我希望排队的消息会下降。
  • 嗨@DavinTryon,任务由Celery处理,这使我们可以简单地用@@celery.task装饰一个Python函数,我不知道celery如何在内部处理确认。但是,当我运行 rabbitmqctl list_consumers 时,我得到了一个消费者,它的确认所需的布尔值设置为 False。
  • @DavinTryon;似乎 Celery 的默认设置是在工人拿起任务后立即确认:celery.readthedocs.org/en/latest/userguide/tasks.html

标签: python rabbitmq celery


【解决方案1】:

回答我自己的问题;

Celery 为调用代码中的每个任务发回一条结果消息。此消息通过相同的 AMPQ 队列发回。 这就是为什么任务正常工作,但队列不断填​​满的原因。我们没有处理这些结果,甚至对它们感兴趣。

我将ignore_result=True 添加到 celery 任务中,因此该任务将结果消息发送回队列。这是解决问题的主要方法。

此外,添加了配置选项 CELERY_SEND_EVENTS=False 以加速 celery。如果设置为 TRUE,此选项让 Celery 为外部监控工具发送事件。

除此之外,CELERY_TASK_RESULT_EXPIRES=3600 现在确保即使结果被发回,如果没有收到/确认,它们也会在一小时后过期。

最后 CELERY_RESULT_PERSISTENT 设置为 False,这将 celery 配置为不在磁盘上存储这些结果消息。当服务器崩溃时它们会消失,这在我们的例子中很好,因为我们不使用它们。

简而言之;如果您的应用程序不需要关于任务是否完成以及何时完成的反馈,请在 celery 任务上使用ignore_result=True,这样就不会发回任何消息。 如果您确实需要该信息,请确保您拿起并处理结果,这样队列就不会被填满。

【讨论】:

    【解决方案2】:

    如果您不需要可靠性,那么您可以使您的队列瞬态。

    http://celery.readthedocs.org/en/latest/userguide/optimizing.html#optimizing-transient-queues

    CELERY_DEFAULT_DELIVERY_MODE = 'transient'
    

    【讨论】:

    • 我对持久消息没问题,事实上,我更喜欢它而不是瞬态消息,我不确定这将如何解决问题;消息似乎一直在排队,使它们瞬态只会导致消息在发生灾难时丢失。
    猜你喜欢
    • 2013-07-15
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2019-01-21
    • 2015-06-17
    相关资源
    最近更新 更多