9

对于不始终支持优先级消息的面向消息的中间件(例如 AMQP),当队列只有 FIFO 语义时,实现优先级消费的最佳方式是什么?一般用例是这样一个系统,当队列中存在大量消息积压时,消费者在接收优先级较低的消息之前接收优先级较高的消息。

4

1 回答 1

10

鉴于给定单个队列仅支持 FIFO,您当然必须引入多个队列、中介或拥有更复杂的消费者。

可以通过几种方式处理多个队列。生产者和消费者可以同意在它们之间有两个队列,一个用于高优先级,一个用于后台任务。

如果您的生产者受限于单个队列,但您可以控制消费者,请考虑在路径中引入扇出路由器。所以生产者->路由器是一个队列,然后路由器有两个队列到消费者。

另一种可能不太理想的解决方法是让您的消费者旋转一个线程到队列前面,然后在内部分派工作。类似于上面的路由器版本,但在单个应用程序中。这样做的缺点是在您的应用程序中传输多条消息,如果发生故障,这可能会使恢复变得复杂。

不要忘记考虑有效的低优先级事件的饥饿,不管它们是什么,如果它们中的一些应该被处理,即使还有更高优先级的事件仍然存在。

于 2009-12-24T02:13:11.490 回答