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

RabbitMQ和消息优先级

云开诚
2023-03-14

RabbitMQ有消息优先级的概念吗?我有一个问题,一些更重要的消息由于队列中不太重要的消息而被拖慢。我希望高优先级的优先,并移动到队列的前面。

我知道我可以用两个队列来近似计算,一个是“快”队列,另一个是“慢”队列,但这看起来像是一个黑客。

有人知道使用RabbitMQ的更好的解决方案吗?

共有3个答案

仇建茗
2023-03-14

IIRC RabbitMQ仍然使用AMQP协议版本0.9.1(在此处获取规范)。规范明确提到了消息优先级:

Messages may have a priority level. A high priority message is sent ahead of lower     priority messages
waiting in the same message queue. When messages must be discarded in order to maintain a specific
service quality level the server will first discard low-priority messages.

以及:

Note that in the presence of multiple readers from a queue, or client transactions, or use of priority fields,
or use of message selectors, or implementation-specific delivery optimisations the queue MAY NOT
exhibit true FIFO characteristics.

规范说优先级是必须的,所以我猜RabbitMQ应该实现它,但是你可能想咨询它的留档。

乐正育
2023-03-14

兔子没有优先权的概念,就像布赖恩简洁地说的那样,前面的那个先到达那里

我建议实施一组队列,为您的特定消息传递需求提供服务,并让这些队列对您的优先级需求进行建模,例如,将它们称为“MyQueueP1”、“MyQueueP2”等等,然后让我们的消费者在P2之前检查P1(等),并首先从那里服务消息。

如果你有一个高优先级的消息,你会通过一个合适的路由键把它发布到合适的优先级队列中。

[更新]检查这个问题:在FIFO QUEING系统中,实现优先级消息的最佳方式是什么

[更新]根据最近的RabbitMQ 3.5.0版,此答案现已过时,应仅对本版本之前的版本有效。https://stackoverflow.com/a/29068288/489888

傅朝
2023-03-14

关于这个问题的答案已经过时了。从RabbitMQ 3.5.0开始,现在有了对AMQP标准每消息优先级的核心支持。文件中有所有血淋淋的细节,但简而言之:

  • 您需要在创建队列时定义队列的优先级范围;
  • 没有优先级集的消息获得0的优先级;
  • 数字优先级高于队列上最大设置的消息将获得队列支持的最高优先级。

更多有趣的警告在文档中。读它们非常值得。

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

  • Netty中是否有任何嵌入式优先级机制可以帮助我决定哪些消息比其他消息发送得更频繁?

  • 我们可以使RabbitMQ分布式优先级队列通过安装插件Rabbitmq-优先级队列从https://www.rabbitmq.com/community-plugins.html.我将元素推送到队列中(每个元素都有一个优先级),并且我能够根据需要在消费者中接收队列的内容-较高优先级的元素首先出现。 问题是,当这种情况持续发生时,优先级轮询概念不起作用: 运行发布服务器以填充队列中具有不同优先级的3

  • 主要内容:9. RabbitMQ 其他知识点,9.1 幂等性,9.2 优先级队列,9.3 惰性队列9. RabbitMQ 其他知识点 9.1 幂等性 9.1.1 概念 用户对于统一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生副作用 举个栗子,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,会进行第二次扣款,返回结果依然成功。用户查询余额发现多扣钱了,流水记录也变成了两条。 在以前的但应用系统中,我们只需要把数据操作放入事务

  • 在队列选项卡的rabbitMQ web界面上,我看到了“概述”面板,我在其中找到了以下内容: 排队消息: 准备好了 未确认 总数 我猜“总数”是多少。但什么是“准备就绪”和“未确认”?“准备好了”——传递给消费者的信息?“未确认”-? 消息费率: 发表 交付 重新交付 承认 这些信息是什么?尤其是“重新交付”和“确认”?这是什么意思?

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