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



我正在用芹菜构建一个烧瓶应用程序,使用 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 的文档?

谢谢!

编辑

  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

Celery 的默认行为是创建所有缺少的队列(请参阅CELERY_CREATE_MISSING_QUEUES文档。默认情况下,将使用"持久"标志创建任务队列。如果CELERY_TASK_RESULT_EXPIRES参数不是 None (默认情况下设置为 1 天),则将使用"持久"、"自动删除"标志和"x-expires"创建结果队列。

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

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

编辑

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

  2. 队列
  3. 参数化文档可以在此处的"使用瞬态队列"段落中找到,但查看它的最佳方式是使用 RabbitMQ 管理插件,它允许您在 Web UI 中监视声明的队列及其配置(您可以看到持久 D 标志和自动删除的 A-D 标志)。最后,芹菜并不"知道"队列是否是结果队列,但是,在创建时,任务被分配给唯一标识符。此标识符将用于任何结果的队列名称。这意味着,如果任务的生产者等待结果,它将侦听该队列,无论何时创建她。而使用者,一旦任务确认,在任务真正执行之前,如果任务不忽略结果(通过设置CELERY_IGNORE_RESULT或任务自定义选项),将检查命名为任务标识符的队列是否存在,如果不存在,它将使用默认的结果配置创建它(请参阅结果后端配置)

相关内容

  • 没有找到相关文章

最新更新