我正在使用带有RabbitMQ的Celery。最近,我注意到大量临时队列正在制作中。
所以,我进行了实验,发现当任务失败时(即任务引发异常),就会形成一个具有随机名称的临时队列(如c76861943b0a4f3aaa6a99a6db06952c)并保留队列。
在rabbitmqadmin中找到的临时队列的一些属性如下 -
auto_delete:是的 消费者:0 耐用:假 消息:1 messages_ready:1
每次任务失败时都会生成一个这样的临时队列(即引发异常)。如何避免这种情况?因为在我的生产环境中会形成大量这样的队列。
答案 0 :(得分:17)
听起来你正在使用amqp作为结果后端。从docs这里可以看出使用该特定设置的缺陷:
- 每个新任务在服务器上创建一个新队列,有数千个 经纪人可能会在队列中超载这些任务,这会影响到 以负面方式表现。如果您正在使用RabbitMQ,那么每个 队列将是一个单独的Erlang进程,所以如果你计划的话 同时保留很多结果你可能不得不增加Erlang
进程限制,以及操作系统的最大文件描述符数 允许- 旧结果不会自动清除,因此您必须制作 一定要消耗结果,否则队列数就会消耗 最终失去控制。如果您正在运行RabbitMQ 2.1.1或 更高,你可以利用队列的x-expires参数, 它会在一定时限后过期 没用过。队列到期时间可以设置(以秒为单位) CELERY_AMQP_TASK_RESULT_EXPIRES设置(默认情况下未启用)。
从我在changelog中读到的内容来看,这不再是版本> = 2.3.0中的默认后端,因为用户通过此行为得到了后端。如果这不是您需要的功能,我建议您更改结果后端。
答案 1 :(得分:11)
正如菲利普所说,我仍在使用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
答案 4 :(得分:0)
amqp
后端为每个任务创建一个新队列。如果你想避免它,可以使用rpc
后端,将结果保存在一个队列中。
在您的配置中,设置
CELERY_RESULT_BACKEND = 'rpc'
CELERY_RESULT_PERSISTENT = True
您可以阅读有关this on celery docs的更多信息。