对于不一致支持优先级消息(如AMQP)的面向消息的中间件,当队列只有FIFO语义时,实现优先级消耗的最佳方法是什么?一般用例是一个系统,当队列中存在大量积压的消息时,消费者在优先级较低的消息之前接收具有较高优先级的消息。
答案 0 :(得分:10)
对于给定的单个队列,只有FIFO支持,您当然必须引入多个队列,中介或具有更复杂的消费者。
可以通过多种方式处理多个队列。生产者和消费者可以同意在他们之间有两个队列,一个用于高优先级,一个用于后台任务。
如果您的生产者被限制在单个队列中,但您可以控制消费者,请考虑在路径中引入扇出路由器。所以producer-> Router是一个单一的队列,然后路由器有两个队列给消费者。
解决它的另一种方法可能不太理想,就是让你的消费者将一个线程旋转到队列前面,然后在内部调度工作。像上面的路由器版本,但在一个应用程序内。这有一个缺点,即在您的应用程序中有多个消息在飞行中,这可能会在发生故障时使恢复变得复杂。
不要忘记考虑有效低优先级事件的饥饿,无论它们是什么,如果有一些事件应该被处理,即使有更高优先级的事件仍然存在。