使用rabbitmq作为芹菜后端进行正确配置

使用rabbitmq作为芹菜后端进行正确配置,rabbitmq,celery,pika,Rabbitmq,Celery,Pika,我正在用芹菜构建一个flask应用程序,使用rabbitmq作为芹菜的后端 我对芹菜的看法是 CELERY_BROKER_URL='amqp://localhost:5672', CELERY_RESULT_BACKEND='amqp://', CELERY_QUEUE_HA_POLICY='all', CELERY_TASK_RESULT_EXPIRES=None 然后,声明队列会产生一大堆错误 connection = pika.BlockingConnection(pika.Connec

我正在用芹菜构建一个flask应用程序,使用rabbitmq作为芹菜的后端

我对芹菜的看法是

CELERY_BROKER_URL='amqp://localhost:5672',
CELERY_RESULT_BACKEND='amqp://',
CELERY_QUEUE_HA_POLICY='all',
CELERY_TASK_RESULT_EXPIRES=None
然后,声明队列会产生一大堆错误

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue=new_task_id)
错误

好的,我把它改为
channel.queue\u declare(queue=new\u task\u id,durable=True)

再一次,错误

PreconditionFailed: Queue.declare: (406) PRECONDITION_FAILED - inequivalent arg
'auto_delete' for queue '1419350288' in vhost '/':
received 'true' but current is 'false'
好的,我把它改为
channel.queue\u declare(queue=new\u task\u id,durable=True,auto\u delete=True)

这次错误消失了

但是在我犯这些错误之前我怎么知道呢?我在上搜索了芹菜的文档,详细的文档,但没有得到我需要的——它只是列出了所有的conf项,但没有告诉我如何设置它。或者是rabbitmq的文件我应该参考一下

谢谢大家!

编辑

  • So,在配置文件或任何已注册任务中声明的所有队列。
    你能再解释一下吗?
    declare
    create
    之间有什么区别

  • 您说过将使用“持久”、“自动删除”标志创建结果队列,我在哪里可以找到此信息?芹菜如何知道队列是结果队列


  • 芹菜的默认行为是创建所有缺少的队列(请参阅。任务队列默认情况下将使用“持久”标志创建。如果
    芹菜\u任务\u结果\u过期
    参数不是无(默认情况下,它设置为1天),则结果队列将使用“持久”、“自动删除”标志和“x-expires”创建

    因此,在您的配置文件或任何已注册任务中声明的所有队列。此外,当您使用amqp result backend时,如果您没有设置
    CELERY\u IGNORE\u result
    参数,则将在初始化tash时创建结果队列,并将其命名为任务id

    因此,如果您试图用冲突的配置重新声明此队列,RabbitMQ将拒绝它。因此,您不必创建它

    编辑

  • 队列“声明”,如中所示,允许检查RabbitMQ中是否存在队列,如果不存在,则创建它。如果芹菜配置中的
    CELERY\u create\u MISSING\u QUEUES
    设置为True,则初始化时,
    CELERY\u QUEUES
    CELERY\u DEFAULT\u Queue
    参数中列出的任何队列,或注册ta中声明的任何自定义队列sks选项,例如
    @task(name=“custom”,queue=“my_custom_queue”)
    ,或者甚至在自定义
    芹菜路由定义中,都将提交给RabbitMQ,因此,如果它们不存在,将创建它们

  • 队列参数化文档可以在Using Transient Queues(使用临时队列)一段中找到,但最好的方法是使用RabbitMQ管理插件,允许您在Web UI中监视声明的队列及其配置(您可以看到D标志表示持久,a-D标志表示自动删除)。 最后,芹菜不“知道”如果队列是结果队列,但在创建时,任务被分配给唯一标识符。此标识符将用于任何结果的队列名称。这意味着,如果任务的生产者等待结果,则无论何时创建该队列,它都将侦听该队列。而消费者则在任务确认后,在重新执行任务之前lly executed,如果任务不忽略结果(通过设置
    Cellery\u ignore\u RESULT
    或任务自定义选项),将检查名为任务标识符的队列是否存在,如果不存在,将使用默认结果配置创建它(请参阅)


  • 谢谢你的回答!我想你几乎解决了我的问题。请看我的编辑。
    PreconditionFailed: Queue.declare: (406) PRECONDITION_FAILED - inequivalent arg
    'auto_delete' for queue '1419350288' in vhost '/':
    received 'true' but current is 'false'