2009-07-16 116 views
8

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

+2

你有多个队列吗?如果是这样,我会建议有一个高优先级消息的单独队列,这是在标准队列之前首先被查询的,这只有在优先级队列是空的时才被使用。我不知道这是否符合你的情况,但这是我的第一个想法。 – CodeFusionMobile 2009-07-16 17:58:42

+0

我同意CSharpWithJava。我目前在做一个大的即时通讯应用,我想从你的问题,你需要多个队列,这样你就可以卸载低优先级的消息,以较低的优先级队列,并立即读取高优先级。 – 2009-09-30 17:39:46

回答

10

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

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

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

另一种方法来解决它,这很可能不太理想,将有你的消费旋转一个线程来前的队列,然后派遣工作内部。就像上面的路由器版本,但在一个应用程序内。这具有在应用程序中运行多个消息的缺点,这可能会使发生故障时的恢复复杂化。

不要忘记考虑有效的低优先级的事件,无论他们是饥饿,如果他们中的一些应即使仍有闲逛更高优先级的事件进行处理。

相关问题