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

时间:2018-04-11 08:14:33

标签: 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})

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

Queue('my_queue', exchange=Exchange('my_queue'), routing_key='my_queue', consumer_arguments={'priority': 10})

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

my_task.apply_async(args=(arg1, arg2), priority=6)

谢谢。

经过更多研究后编辑:

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

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

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

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

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

你怎么看?是吗?

1 个答案:

答案 0 :(得分:1)

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

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


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

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

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