消息优先级在消息队列系统中本质上是不重要的吗?

17
大多数我看过的消息系统似乎都只有基本的、如果有的话,对于优先消息队列的支持。例如,AMQP只规定了最低的2个优先级。RabbitMQ,作为AMQP的实现,不支持任何优先级。ActiveMQ将在5.4版本中在几天后支持10个消息优先级。10个优先级是由JMS规范指定的。
在非消息传递的意义上,优先队列根据一个任意字段的优先级进行内容排序,而该字段的优先级范围没有限制。为什么像这样的实现不作为消息传递系统的一部分存在呢?正如我在标题中所问,优先级是否本质上是一个非消息传递的概念?
我意识到一个可能的答案是,优先级的概念引入了消息在队列中无限等待的可能性,而较高优先级的消息则被处理。还有其他原因吗?

一些评论:这可能更适合于CSTheory.SE,我认为你在帖子中解决了优先级问题。你必须有一种方法来防止死锁或停滞......我倾向于将消息队列视为转发消息的目的,而不是负责任何主要业务逻辑。 - jcolebrand
5个回答

7

顺便提一下,ActiveMQ现在通过JMSPriority头在5.4.x中支持优先级消息

与其让消息代理在消息到达时重新排序缓冲区中的消息,通常有更好的技术来实现优先级消费,例如为高优先级消息设置专用的消费者池。这样无论低优先级消息有多少噪音,高优先级消息总是能够通过。

鉴于消息传递的异步性质,如果使用JMSPriority头等内容,很容易用低优先级消息填满缓冲区、网络管道和预取队列


6

一般来说,消息队列系统用于确保不同系统之间的消息传递。

通常情况下,会有某种一次性保证,并且通常还承诺消息将按顺序到达。

总的来说,这就决定了您正在构建和连接的系统的设计。

解耦系统之间的优先级概念通常并没有太多意义。

尽管如此,一种常见的解决方法是拥有两个队列,一个高优先级队列和一个后台优先级队列。然而,由于接收系统可能无法在更高优先级请求到来时停止处理低级别请求,因此它们通常以该粒度级别的顺序依次完成,这是固有的问题。


1
谢谢你的答案。我也有同样的感受。我的不满来自于最初试图使用消息队列实现作业排队系统,现在意识到这是错误的。 - Edward Dale

1

在编程中,我们必须小心使用过多的优先级,以至于使用程序比逐个查看每个消息更加繁琐。


1

在我看来,这个想法可能更类似于“进程优先级”而不是优先队列中的优先级值。毫无疑问,这与JMS规范中关于它的一两句话以及AMQP规范显然是一致的。


0

消息系统被设计和优化为按时间顺序排序。文件系统被优化为追加文件,而不是在开头或中间插入数据。类似队列的数据结构通常被优化为在末尾添加和从头部删除。对于文件系统,这意味着将文件追加(添加)到文件和事务日志中(删除),并在消耗消息文件后删除它们(删除)。

将优先级引入处理队列有效地将队列转换为具有时间顺序和优先级排序的数据结构。基本上,当涉及到使用文件存储时,这是相当次优的,因为您必须创建某种索引策略。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接