当前位置: 首页 > 知识库问答 >
问题:

芹菜和RabbitMQ-队列优先级vs.消费者优先级vs.任务优先级

葛智敏
2023-03-14

在我的python应用程序中,我使用芹菜作为任务生产者和消费者,使用RabbitMQ作为代理。现在,我正在实施优先级排序。起初,它看起来根本不起作用,因为根据文档,我刚刚在队列中添加了x-max-priority参数。我更深入地研究了一下,发现了另一种优先级——消费者优先级和任务优先级。所以,现在,看起来有三种不同的优先顺序,我完全困惑了。你能给我解释一下区别吗?

队列最大优先级:即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})

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

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

非常感谢。

经过进一步研究后编辑:

我读了更多的书后才明白:

队列最大优先级是一种限制,它告诉这个队列只监听优先级设置为最大值的任务,直到这个参数。但是更高优先级的任务呢?队列是否将优先级降低到自定义的最大值?无视他们?

消费者优先级看起来像是消费者的优先级。如果有两个优先级不同的消费者,并且他们都是免费的,那么第一个消费消息的人就是优先级更高的人。但是为什么它是由队列定义的,而不是由消费者本身定义的?

任务优先级应该是优先级,这对我的需求来说是最重要的。它告诉我们应该优先阅读此消息

因此,看起来最好的优先级将通过将所有优先级与多个辅助角色和并发设置为1相结合来实现,而不是一个具有更高并发的辅助角色,并配置了worker_prefetch_multipliertask_acks_late

你怎么认为?是这样吗?

共有1个答案

彭宜人
2023-03-14
  • x-max优先级是用于定义优先级队列的RabbitMQ参数。提供的值是队列支持的最高优先级。
  • 如果多个消费者可用于工作,消费者优先考虑给定的消费者。
  • 任务优先级是你如何告诉芹菜任务的优先级。您的代理(和队列)需要支持优先级,以便执行任何操作。

如果您为cyery提供的任务的优先级高于队列的x-max-优先级,cyery将使用x-max-优先级值将消息放在队列上。

我不知道你所说的“最佳优先顺序”是什么意思。当您启动芹菜工作者时,它会启动RabbitMQ使用者和N个其他进程(由并发参数控制)来处理任务。主辅助进程将使用任务的消息,并将任务放置在其池中,由其中一个池辅助进程处理。

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

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

 类似资料:
  • RabbitMQ有消息优先级的概念吗?我有一个问题,一些更重要的消息由于队列中不太重要的消息而被拖慢。我希望高优先级的优先,并移动到队列的前面。 我知道我可以用两个队列来近似计算,一个是“快”队列,另一个是“慢”队列,但这看起来像是一个黑客。 有人知道使用RabbitMQ的更好的解决方案吗?

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。

  • 优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列。 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优

  • 我有2个RabbitMQ队列: = 正如您对其名称所设想的那样,队列使用死信交换功能,这意味着当消息过期时,它将被重新调用到我的。 我试图实现的是在每次处理失败并将消息推送到DLX队列时增加消息的。 问题是,即使消息过期,当它不在队列的底部(头部)时,它也不会请求我的。因此,如果DLX队列中有到期时间为7天的消息,并且我们将到期时间为5秒的新消息加入队列,则该消息将仅在7天5秒后请求到。... 我