RabbitMQ:优先级不断变化的优先级队列

lbsnaicq  于 2022-12-04  发布在  RabbitMQ
关注(0)|答案(1)|浏览(227)

我想实现一个优先级工作队列,其中一组消息的优先级可以在它们进入队列后更改。由于这是一个处理时间可变的工作队列,因此不使用循环算法分配消息,而是在资源空闲时从队列中提取消息(使用每个使用者限制)。
我提出了两个实施想法:
1.使用RabbitMQ中的priority queue,当请求更改优先级时,从队列中读取具有该优先级的消息,并以不同的优先级重新发送它们。(考虑到O(n)的复杂度,我不确定这是一个好方法。
1.为每组消息使用多个具有不同名称的队列,并使用单独的队列将当前优先级列表(队列名称的有序列表)传递给工作者。(使用这种方法,我不确定如何使优先级列表“持久化”,以便新加入的工作者知道当前优先级列表是什么。)
您将如何实现它?RabbitMQ是否适合此用例?

gab6jxml

gab6jxml1#

你的想法是“一旦消息进入队列,它们的优先级就会改变”IMO在rabbitmq中是不可能的,因为rabbitmq只允许你从队列的头部获取消息。

例如:

  • 您有N个队列,每个队列用于不同的优先级
  • 每个队列有100多条消息
  • 你的想法要求你到达队列的中间以获得特定的消息,但是这在rabbitmq中是不可能的,所以思想实验到此为止,因为你只能获得队列头部的消息

你的想法IMO将需要使用除了rabbitmq之外的其他东西。
一个快速而肮脏的想法,将工作与rabbitmq现在,并类似于你的想法:

  • 创建一个具有N个优先级rabbitmq队列
  • 提交优先级为x消息
  • 如果您需要将优先级更改为更高的优先级,如优先级y,则您可以再次发送相同的消息,但具有新的更高优先级y
  • 这将确保更快地处理新消息,
  • 副作用是您可能会处理同一个请求两次
  • 您可以通过使用某种数据库进行同步来跟踪已完成的作业,从而修复设计中的副作用,这样可以避免两次处理作业
  • 还有许多其他细节需要解决,例如以某种方式将原始消息保持在RabbitMQ、并发性等之外,等等,

相关问题