在我的 python 应用程序中,我使用 Celery 作为任务生产者和消费者,使用 RabbitMQ 作为代理。现在,我正在实施优先级。起初,它看起来根本不起作用,因为根据文档,我刚刚添加了x-max-priority
队列的参数。我更深入地查找,发现了另一个优先级——消费者优先级和任务优先级。所以,现在看起来有三个不同的优先级,我完全困惑了。您能解释一下其中的区别吗?
队列最大优先级:即https://www.rabbitmq.com/priority.html 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 https://www.rabbitmq.com/consumer-priority.html
Queue('my_queue', exchange=Exchange('my_queue'), routing_key='my_queue', consumer_arguments={'priority': 10})
任务优先级:即https://github.com/celery/celery/issues/2635#issuecomment-173597053 https://github.com/celery/celery/issues/2635#issuecomment-173597053
my_task.apply_async(args=(arg1, arg2), priority=6)
谢谢。
经过更多研究后编辑:
经过更多阅读后我了解到:
队列最大优先级是一种限制,表明该队列仅侦听优先级设置为 max 直至此参数的任务。但是更高优先级的任务呢?队列是否将优先级降低到其自身定义的最大优先级?不理睬他们?
消费者优先看起来像是消费者优先。如果有两个优先级不同的消费者,并且两个消费者都空闲,则第一个消费消息的消费者是优先级较高的消费者。但为什么它是用队列定义的,而不是用消费者本身定义的呢?
任务优先级应该是优先顺序,这对我的需求来说是最重要的。它告诉您应该优先阅读此消息。
因此,看起来最好的优先级将通过多个工作线程和并发设置为 1 的所有优先级的组合来实现,而不是一个具有更高并发性和并发度设置为 1 的工作线程。worker_prefetch_multiplier
and task_acks_late
配置。
你怎么认为?是对的吗?