Celery制造的临时队列

Sid*_*rth 20 rabbitmq celery

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

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

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

auto_delete:真正的消费者:0持久:错误消息:1 messages_ready:1

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

Phi*_*ham 17

听起来你正在使用amqp作为结果后端.从这里的文档是使用该特定设置的陷阱:

  • 每个新任务都会在服务器上创建一个新队列,其中代理可能会使用队列重载数千个任务,这将以
    负面方式影响性能.如果您正在使用RabbitMQ,那么每个
    队列将是一个单独的Erlang进程,因此如果您计划
    同时保留许多结果,则可能必须增加Erlang
    进程限制,以及您的OS
    允许的最大文件描述符数
  • 旧结果不会自动清除,因此您必须确保使用结果,否则队列的数量最终会失控.如果您正在运行RabbitMQ 2.1.1或更高版本,则可以利用队列的x-expires参数,这将在未使用后的某个时间限制之后使队列到期.可以通过CELERY_AMQP_TASK_RESULT_EXPIRES设置(默认情况下未启用)设置队列到期(以秒为单位).

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


Sid*_*rth 11

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

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

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