Celery和RabbitMQ - 队列优先级与消费者优先级与任务优先级

Hon*_*nza 7 python rabbitmq celery

在我的python应用程序中,我使用Celery作为任务生产者和消费者,使用RabbitMQ作为经纪人.现在,我正在实施优先级.起初,它看起来根本不起作用,因为根据文档,我刚刚x-max-priority为队列添加了参数.我更深入地查看,并且我发现了另一个优先级 - 消费者优先级和任务优先级.所以,现在看起来有三种不同的优先级,我完全糊涂了.你能解释一下我的区别吗?

队列最高优先级:viz https://www.rabbitmq.com/priority.html

Queue('my_queue', exchange=Exchange('my_queue'), routing_key='my_queue', queue_arguments={'maxPriority': 10})
Run Code Online (Sandbox Code Playgroud)

消费者优先权:viz https://www.rabbitmq.com/consumer-priority.html

Queue('my_queue', exchange=Exchange('my_queue'), routing_key='my_queue', consumer_arguments={'priority': 10})
Run Code Online (Sandbox Code Playgroud)

任务优先级:viz https://github.com/celery/celery/issues/2635#issuecomment-173597053

my_task.apply_async(args=(arg1, arg2), priority=6)
Run Code Online (Sandbox Code Playgroud)

谢谢.

经过更多研究后编辑:

正如我在阅读后所理解的那样:

队列最大优先级是一种限制,并告诉该队列仅侦听优先级设置为max max到此参数的任务.但是优先级更高的任务呢?队列是否优先于自身最大定义?忽略它们?

消费者优先权看起来像消费者的优先次序.如果有两个具有不同优先级的消费者且两者都是免费的,则消费消息的第一个消费者是具有更高优先级的消费者.但是为什么它用Queue定义而不是消费者本身?

任务优先级应该是优先级,这对我的需求最重要.它告诉我应该以给定的优先级读取此消息.

因此,看起来最好的优先级将通过将所有优先级与多个worker和并发设置为1的组合来实现,而不是一个具有更高并发性且具有worker_prefetch_multipliertask_acks_late配置的worker .

你怎么看?是对的吗?

D H*_*son 1

  • x-max-priority是用于定义优先级队列的 RabbitMQ 参数。提供的值是队列支持的最高优先级。
  • 如果多个消费者可以工作,则消费者优先级有利于某个特定消费者。
  • 任务优先级是告诉 celery 任务优先级的方式。您的代理(和队列)需要支持优先级才能执行任何操作。

如果您为 celery 提供的任务的优先级高于队列的优先级x-max-priority,则 celery 会将消息放入具有 x-max-priority 值的队列中。


我不确定你所说的“最佳优先级”是什么意思。当你启动一个 celery Worker 时,它会启动一个 RabbitMQ 消费者和 N 个其他进程(由并发参数控制)来处理任务。主工作进程将使用任务的消息并将任务放入其池中以供池工作人员之一处理。

正如您所说,您可以通过为实际执行任务的每个进程设置一个队列消费者,以不同的方式从队列中消费。这是否具有更大的任务吞吐量取决于您的环境以及通过队列的任务数量;但是,我不认为它会影响任务的优先级。

如果您有优先级队列(特别是如果您的任务长时间运行),那么选择较低的预取值是明智的,因为在将高优先级任务放入队列之前已经从队列中消耗(提取)的任何任务将首先运行。