2011-08-22 92 views
20

我正在用RabbitMQ使用芹菜。最近,我注意到大量的临时队列正在制作中。芹菜临时排队

所以,我尝试和发现,当一个任务失败(这是一个任务,提出了一个例外),然后临时队列与随机名称(如c76861943b0a4f3aaa6a99a6db06952c)形成和队列仍然存在。

在rabbitmqadmin发现临时队列的一些属性如下 -

auto_delete:真 消费者:0 耐用:假 消息:1 messages_ready:1

而且这样的一个临时队列每次任务失败时(即引发异常)。如何避免这种情况?因为在我的生产环境中会形成大量这样的队列。

+0

这是一个有趣的观察!我也想知道。 –

+1

嗨Elver。我能够解决这个问题。请看看答案(也是我的一个答案)。希望能帮助到你。 – Siddharth

回答

11

那么,菲利普就在那里。以下是我如何解决它的描述。它是celeryconfig.py中的一个配置。

正如Philip所说,我仍在使用CELERY_BACKEND =“amqp”。但除此之外,我现在正在使用CELERY_IGNORE_RESULT = True。此配置将确保不为每个任务形成额外的队列。

我已经在使用这种配置,但是当任务失败时,额外的队列就形成了。然后我发现我正在使用另一个需要删除的配置,即CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True。它做了什么,它没有存储所有任务的结果,但只做了错误(失败的任务),因此失败的任务有一个额外的队列。

+0

哇!这为我解决了它。我甚至没有意识到这是一个问题,因为我在每个任务描述符中设置了ignore_result = True。但我添加了CELERY_IGNORE_RESULT = True和CELERY_STORE_ERRORS_EVEN_IF_IGNORED = False和中提琴 - 处理后没有更多的额外队列!我仍然可能会将redis视为替代后端,但找到此解决方案真的很不错。谢谢! – chaimp

+0

@jeffp - 很高兴听到。我最近还和芹菜一起使用了Redis--我不认为这是一个问题。芹菜本身形成并保持队列。所以这个配置很重要。 – Siddharth

+1

我在过去的一天发现了另外一件事情,我认为这对读者来说非常有帮助:需要有多名工作人员并将不同的任务分配给每个工作人员。了解celeryd-multi并使用它是明智的。这些文档并没有说明这一点,但它是有效使用可用系统资源并且不让队列得到备份的关键。 – chaimp

16

这听起来像你使用amqp作为结果后端。从这里docs是使用该特定设置的陷阱:

  • 每一个新的任务在服务器上创建一个新的队列,与成千上万的 任务的经纪人可以与队列过载,这将影响
    以负面方式表现。如果您使用的是RabbitMQ,那么每个队列将是一个单独的Erlang进程,因此如果您计划在
    之间同时保留许多结果,则可能需要增加Erlang
    进程限制以及文件描述符的最大数量你的操作系统
    允许
  • 旧的结果将不会被自动清除,所以你必须做出 确保消费的结果,否则队列数量将 最终失控。如果您运行的是RabbitMQ 2.1.1或 ,则可以利用队列中的x-expires参数 ,这些队列在 未使用后将在一定时间限制后过期。队列过期可以通过CELERY_AMQP_TASK_RESULT_EXPIRES设置(默认情况下未启用)设置(以秒为单位) 。

从我在changelog读过,这不再是版本> = 2.3.0,因为用户通过这种行为获得的后端位的默认后端。如果这不是您需要的功能,我会建议更改后端结果。

+0

CELERY_AMQP_TASK_RESULT_EXPIRES已被弃用,CELERY_TASK_RESULT_EXPIRES是新的配置设置名称。默认现在将其保存1天,将其设置为0意味着永久保存。 – cbron

3

CELERY_TASK_RESULT_EXPIRES指示临时队列的生存时间。默认值是1天。您可以修改此值。

0

amqp后端失去做的事情一样add_consumer,cancel_consumer等方面的能力,会为每个任务一个新的队列。如果你想避免它,你可以使用rpc后端,它将结果保存在单个队列中。

在你的配置,设置

CELERY_RESULT_BACKEND = 'rpc' 
CELERY_RESULT_PERSISTENT = True 

你可以阅读更多关于this on celery docs