对于不支持优先级消息的面向消息的中间件(例如AMQP),当队列只有FIFO语义时,实现优先级消费的最佳方法是什么? 一般的用例是,在队列中存在大量消息积压时,消费者在收到较低优先级的消息之前先收到较高优先级的消息。
对于不支持优先级消息的面向消息的中间件(例如AMQP),当队列只有FIFO语义时,实现优先级消费的最佳方法是什么? 一般的用例是,在队列中存在大量消息积压时,消费者在收到较低优先级的消息之前先收到较高优先级的消息。
如果一个单一队列只支持FIFO服务,那么你需要引入多个队列、中间件或更复杂的消费者来解决问题。
多个队列可通过以下几种方式处理。生产者和消费者可以在它们之间约定两个队列,一个用于高优先级任务,另一个用于后台任务。
如果你的生产者只能使用单一队列,但你可以控制消费者,请考虑在路径中引入扇出路由器。所以,生产者->路由器是单一队列,然后路由器有两个队列提供给消费者。
另外一种解决方法(可能不是最理想的)是让消费者旋转一个线程到队列前端,然后在内部分配工作。就像上文提到的路由器版本一样,但是在单个应用程序内部。这种方法的缺点是在应用程序内部存在多个消息同时进行,这可能会在发生故障时导致恢复变得复杂。
不要忘记考虑低优先级事件被有效地饿死,无论它们是什么,如果其中一些事件应该在还有更高优先级事件等待处理时进行处理。