我正在用芹菜构建一个烧瓶应用程序,使用 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)
错误
PreconditionFailed: Queue.declare: (406) PRECONDITION_FAILED - inequivalent arg
'durable' for queue '1419349900' in vhost '/':
received 'true' but current is 'false'
好的,我把它改成了channel.queue_declare(queue=new_task_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_declare(queue=new_task_id, durable=True, auto_delete=True)
这次错误消失了。
但是在我得到这些错误之前我怎么知道呢?我搜索了芹菜关于这个主题的文档,详细的文档,但没有得到我需要的东西——它只是列出了所有的 conf 项目,但没有告诉我如何设置它。还是我应该参考的 rabbitmq 的文档?
谢谢!
编辑
So, all Queues declared in your configuration file, or in any registered tasks.
你能解释一下吗?declare
和create
有什么区别?你说
Result queues will be created with 'durable', 'auto-delete' flags
,我在哪里可以找到这些信息?芹菜怎么知道队列是result queue
?
Celery 的默认行为是创建所有缺少的队列(请参阅CELERY_CREATE_MISSING_QUEUES文档。默认情况下,将使用"持久"标志创建任务队列。如果CELERY_TASK_RESULT_EXPIRES
参数不是 None (默认情况下设置为 1 天),则将使用"持久"、"自动删除"标志和"x-expires"创建结果队列。
因此,在配置文件或任何已注册的任务中声明的所有队列。此外,当您使用 amqp 结果后端时,如果您没有设置 CELERY_IGNORE_RESULT
参数,则工作线程将在 tash 初始化时创建结果队列,并将其命名为 task_id。
因此,如果您尝试使用冲突的配置重新声明此队列,RabbitMQ 将拒绝它。因此,您不必创建它。
编辑
-
队列"声明",如 pika 文档中所示,允许检查 RabbitMQ 中是否存在队列,如果没有,则创建它。如果在 Celery 配置中将
CELERY_CREATE_MISSING_QUEUES
设置为 True,则在初始化时,CELERY_QUEUES
或CELERY_DEFAULT_QUEUE
参数中列出的任何队列,或在已注册任务选项(例如@task(name="custom", queue="my_custom_queue")
)中声明的任何自定义队列,甚至在自定义CELERY_ROUTING
定义中,都将向 RabbitMQ "声明",因此,如果它们不存在,则将创建它们。
队列 参数化文档可以在此处的"使用瞬态队列"段落中找到,但查看它的最佳方式是使用 RabbitMQ 管理插件,它允许您在 Web UI 中监视声明的队列及其配置(您可以看到持久 D 标志和自动删除的 A-D 标志)。最后,芹菜并不"知道"队列是否是结果队列,但是,在创建时,任务被分配给唯一标识符。此标识符将用于任何结果的队列名称。这意味着,如果任务的生产者等待结果,它将侦听该队列,无论何时创建她。而使用者,一旦任务确认,在任务真正执行之前,如果任务不忽略结果(通过设置
CELERY_IGNORE_RESULT
或任务自定义选项),将检查命名为任务标识符的队列是否存在,如果不存在,它将使用默认的结果配置创建它(请参阅结果后端配置)