使用rabbitmq作为芹菜后端纠正配置

时间:2014-12-23 16:08:04

标签: rabbitmq celery pika

我正在用芹菜建造一个烧瓶应用程序,使用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)

这次错误消失了。

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

谢谢!

修改

  1. So, all Queues declared in your configuration file, or in any registered tasks. 你能解释一下吗? declarecreate之间有什么区别?

  2. 您说Result queues will be created with 'durable', 'auto-delete' flags,我在哪里可以找到这些信息?芹菜如何知道队列是result queue

1 个答案:

答案 0 :(得分:1)

Celery的默认行为是创建所有缺失的队列(请参阅CELERY_CREATE_MISSING_QUEUES Documentation。默认情况下,将使用“耐用”标志创建任务队列。结果队列将使用&#39;耐用&#创建39;,&#39;自动删除&#39;标记和&#39; x-expires&#39;如果您的CELERY_TASK_RESULT_EXPIRES参数不是None(默认情况下,它设置为1天)。< / p>

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

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

修改

  1. pika documentation所示,队列&#34;声明&#34;允许检查RabbitMQ中是否存在队列,如果没有,则创建它。如果Celery配置中的CELERY_CREATE_MISSING_QUEUES设置为True,则在初始化时,CELERY_QUEUESCELERY_DEFAULT_QUEUE参数中列出的任何队列,或注册任务选项中声明的任何自定义队列,例如{{1或者甚至在自定义@task(name="custom", queue="my_custom_queue")定义中,对于RabbitMQ将是"declared",因此如果它们不存在则会被创建。

  2. 可以在Using Transient Queues段落中找到队列参数化文档here,但最好的方法是使用RabbitMQ管理插件,允许您在Web UI中监视声明的队列及其配置(您可以看到Durable的D标志和自动删除的AD标志)。 最后,芹菜不知道&#34;如果队列是结果队列,但在创建时,会将任务分配给唯一标识符。该标识符将用作任何结果的队列名称。这意味着如果任务的生产者等待结果,它将在每次创建时监听该队列。消费者,一旦完成任务,在任务真正执行之前,如果任务不忽略结果(通过设置CELERY_ROUTING或任务自定义选项),将检查是否存在名为任务标识符的队列如果没有,它将使用默认的Result配置(参见the Result Backend configuration

  3. 创建它