Rabbitmq 芹菜做的临时队列

Rabbitmq 芹菜做的临时队列,rabbitmq,celery,Rabbitmq,Celery,我在用芹菜配兔子。最近,我注意到有大量的临时排队 因此,我进行了实验,发现当任务失败(即任务引发异常)时,会形成一个带有随机名称的临时队列(如c76861943b0a4f3aaa6a99a6db06952c),并且队列保持不变 rabbitmqadmin中的临时队列的一些属性如下- 自动删除:真 消费者:0 持久性:错误 信息:1 信息准备就绪:1 每次任务失败(即引发异常)时,都会生成一个这样的临时队列。如何避免这种情况?因为在我的生产环境中,会形成大量这样的队列。听起来像是在使用amqp作为

我在用芹菜配兔子。最近,我注意到有大量的临时排队

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

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

自动删除:真 消费者:0 持久性:错误 信息:1 信息准备就绪:1


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

听起来像是在使用amqp作为结果后端。以下是使用该特定设置的陷阱:

  • 每个新任务都会在服务器上创建一个新队列,其中包含数千个 代理中的任务可能因队列而过载,这将影响
    表现消极。如果您使用的是RabbitMQ,则每个 队列将是一个单独的Erlang进程,因此如果您计划
    同时保留多个结果可能需要增加Erlang值
    进程限制,以及操作系统中文件描述符的最大数量
    允许
  • 旧结果不会自动清理,因此您必须 一定要使用结果,否则队列的数量会增加 最终失去控制。如果您正在运行RabbitMQ 2.1.1或 更高的级别,您可以利用x-expires参数创建队列, 这将在队列关闭后的某个时间限制后使其过期 未使用的。队列到期时间可由
    芹菜\u AMQP\u任务\u结果\u过期设置(默认情况下未启用)

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

好吧,Philip就在那里。下面是我如何解决它的描述。它是celeryconfig.py中的一个配置

正如Philip所说,我仍然在使用芹菜。但除此之外,我现在使用芹菜\u IGNORE\u RESULT=True。此配置将确保不会为每个任务形成额外队列


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

芹菜任务结果过期指示临时队列的生存时间。默认值为1天。您可以修改此值。

发生这种情况的原因是因为已启用(默认情况下已启用)

您可以通过将设置设置为False来禁用它
但是,请注意,您将无法使用
芹菜命令执行添加消费者、取消消费者等操作。如果要避免这种情况,可以使用
rpc
后端,它将结果保存在单个队列中

在配置中,设置

CELERY_RESULT_BACKEND = 'rpc'
CELERY_RESULT_PERSISTENT = True

您可以阅读更多有关的信息。

这是一个有趣的观察结果!一、 我也很想知道。嗨,艾尔弗。我能解决这个问题。请看一下答案(我也要一个)。希望有帮助。哇!这为我解决了问题。我甚至没有意识到这是一个问题,因为我在每个任务描述符中都设置了ignore_result=True。但是我添加了芹菜\u IGNORE\u RESULT=True和芹菜\u STORE\u ERRORS\u甚至\u IF\u IGNORED=False和viola-处理后不再有额外的队列!我仍然可以将redis作为一种可选的后端,但找到这个解决方案真的很好。谢谢大家!@很高兴听到这个消息。我最近也用Redis来搭配芹菜——我不认为这有什么问题。芹菜本身形成并维持队列。因此,这种配置很重要。事实上,我在过去的一天里发现了另一件事,我认为这对阅读本文的任何人都非常有帮助:必须有多个工人,并将不同的任务分配给每个工人。建议您了解celeryd multi并使用它。文档没有明确说明这一点,但这是有效使用可用系统资源和不备份队列的关键。CELERY_AMQP_任务_结果_EXPIRES已被弃用,CELERY_任务_结果_EXPIRES是新的配置设置名称。默认值是现在保存1天,设置为0意味着永远保存。