【问题标题】:Is message priority inherently unimportant in message queue systems?消息优先级在消息队列系统中本质上是不重要的吗?
【发布时间】:2011-03-28 19:09:10
【问题描述】:

我看过的大多数消息传递系统似乎都基本支持优先级消息队列(如果有的话)。例如,AMQP 仅specifies 至少有 2 个优先级。 RabbitMQ,一个 AMQP 实现,doesn't support 任何优先级。几天后,ActiveMQ 将在 5.4 版中为 10 个消息优先级提供getting support。 10 个优先级由JMS spec 指定。

priority queue 在单词的非消息传递意义上根据具有不受限制的优先级范围的任意字段对其内容进行排序。为什么像这样的实现不作为消息传递系统的一部分存在?正如我在标题中所问的,优先级本质上是非消息传递概念吗?

我意识到一个答案可能是优先级的概念引入了消息在队列中无限等待处理更高优先级消息的可能性。还有其他原因吗?

【问题讨论】:

  • 几个 cmets:这可能更适合 CSTheory.SE,我认为您在帖子中确定了优先级问题。您必须有一种方法来防止死锁或停滞……我倾向于认为消息队列具有转发消息的目的,而不是负责任何主要业务逻辑。

标签: message-queue messaging activemq rabbitmq amqp


【解决方案1】:

顺便说一句,ActiveMQ 现在通过 JMSPriority 标头在 5.4.x 中支持 priority messaging

不是让消息代理在消息到达时在某个缓冲区内重新排序消息,而是通常有更好的技术来实现优先级消耗,例如having a dedicated consumer pool for high priority messages。然后不管低优先级消息有多少噪音,高优先级消息总是会得到。

鉴于消息传递的异步特性,如果使用 JMSPriority 标头等内容,它很容易用低优先级消息填充缓冲区、网络管道和 prefetch queues

【讨论】:

    【解决方案2】:

    通常,消息队列系统用于确保在不同系统之间传递消息。

    通常,有某种一次性保证,并且通常进一步保证消息将按顺序发送。

    总的来说,这会通知您正在构建和连接在一起的系统的设计。

    解耦系统之间的优先级概念通常没有那么大的意义。

    也就是说,一种常见的解决方法是设置两个队列,一个是高优先级,一个是后台优先级。然而,内在的问题随后变得清晰,因为当更高优先级请求进来时,接收系统当然可能无法停止处理低级别请求,因此它们通常在该粒度级别按顺序完成.

    【讨论】:

    • 感谢您的回答。这也是我的感受。我最初的不满源于我试图用消息队列实现一个作业排队系统,现在我意识到这是不正确的。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      必须小心,因为没有习惯使用太多优先级,以至于使用程序变得比浏览每条消息更繁重。

      【讨论】:

        【解决方案5】:

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

        在处理队列中引入优先级可以有效地将队列转变为同时具有时间顺序和优先级排序的数据结构。基本上,当涉及到文件存储时,它是非常次优的,因为您必须创建某种索引策略。

        【讨论】:

          猜你喜欢
          • 2014-02-08
          • 2020-09-12
          • 2011-01-18
          • 2012-09-29
          • 2022-07-28
          • 2010-10-15
          • 2015-02-11
          • 1970-01-01
          • 2019-08-12
          相关资源
          最近更新 更多