RabbitMQ排队的消息不断增加

时间:2015-05-19 13:52:09

标签: python rabbitmq celery

我们有一个基于Windows的Celery / RabbitMQ服务器,可以为我们的Web应用程序执行进程外的长期运行python任务。
例如,这样做是采用CSV文件并处理每一行。对于每一行,它都会记录我们数据库中的一个或多个记录。

这似乎工作正常,我可以看到工作进程预订的记录。但是,当我使用管理插件(基于Web的管理工具)检查rabbitMQ服务器时,我看到Queued消息增加了,而不是回来了。 Queued messages chart

在连接下,我看到116个连接,每个虚拟主机大约10-15个,所有"运行"但是当我点击时,他们中的大多数都没有闲置。作为国家。 我也想知道为什么这些连接仍然是开放的,如果有什么我需要改变以使它们自己关闭: enter image description here

'队列'我可以看到超过6200项状态“闲置”,而不是减少。

具体而言,我要问的是这些是正常的统计数据,还是我应该担心队列增加但不会再回来,以及似乎不会关闭的持续联系......

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

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

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

回答我自己的问题;

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

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

此外,添加了配置选项CELERY_SEND_EVENTS = False以加速芹菜。如果设置为TRUE,则此选项具有Celery发送事件以用于外部监视工具。

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

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

总之;如果您在应用程序中不需要反馈任务是否以及何时完成,请在芹菜任务上使用ignore_result=True,以便不发回任何消息。 如果你需要这些信息,请确保你拿起并处理结果,以便队列停止填满。

答案 1 :(得分:0)

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

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

CELERY_DEFAULT_DELIVERY_MODE = 'transient'