在我的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_multiplier
和task_acks_late
的worker构造
答案 0 :(得分:1)
如果您为 celery 提供一个优先级高于队列 x-max-priority
的任务,celery 会将消息放入具有 x-max-priority 值的队列中。
我不确定您所说的“最佳优先级”是什么意思。当你启动一个 celery worker 时,它会启动一个 RabbitMQ 消费者和 N 个其他进程(由 concurrency 参数控制)来处理任务。主工作进程将使用任务的消息并将任务放入其池中,由池中的其中一个工作人员处理。
正如您所说,您可以通过为实际执行任务的每个进程设置一个队列使用者,以不同的方式从队列中进行消费。这是否具有更大的任务吞吐量取决于您的环境,并将取决于通过队列的任务数量;但是,我不认为它会影响任务的优先级。
如果您有优先级队列(特别是如果您的任务长时间运行),选择低预取值是明智的,因为在将高优先级任务放入队列之前已经从队列中消耗(获取)的任何任务将先运行。