Celery制造的临时队列

时间:2011-08-22 06:54:12

标签: rabbitmq celery

我正在使用带有RabbitMQ的Celery。最近,我注意到大量临时队列正在制作中。

所以,我进行了实验,发现当任务失败时(即任务引发异常),就会形成一个具有随机名称的临时队列(如c76861943b0a4f3aaa6a99a6db06952c)并保留队列。

在rabbitmqadmin中找到的临时队列的一些属性如下 -

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

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

5 个答案:

答案 0 :(得分:17)

听起来你正在使用amqp作为结果后端。从docs这里可以看出使用该特定设置的缺陷:

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

从我在changelog中读到的内容来看,这不再是版本> = 2.3.0中的默认后端,因为用户通过此行为得到了后端。如果这不是您需要的功能,我建议您更改结果后端。

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

发生这种情况的原因是因为celery workers remote control已启用(默认情况下已启用)。

您可以将CELERY_ENABLE_REMOTE_CONTROL设置为False来禁用它 但请注意,您将无法使用celery command

执行add_consumer,cancel_consumer等操作。

答案 4 :(得分:0)

amqp后端为每个任务创建一个新队列。如果你想避免它,可以使用rpc后端,将结果保存在一个队列中。

在您的配置中,设置

CELERY_RESULT_BACKEND = 'rpc'
CELERY_RESULT_PERSISTENT = True

您可以阅读有关this on celery docs的更多信息。