在FIFO排队系统中,如何实现优先消息传递是最佳方式?

9

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


2
你能使用多个队列吗?如果可以的话,我建议为高优先级消息设置一个单独的队列,该队列在查询时首先被处理,只有当优先级队列为空时才使用标准队列。我不知道这是否符合你的情况,但这是我的第一个想法。 - CodeFusionMobile
我同意CSharpWithJava的观点。我目前正在开发一个大型的消息应用程序,从你的问题中我认为你需要多个队列,这样你就可以将低优先级的消息卸载到低优先级队列中,并立即读取高优先级消息。 - scope_creep
请注意,AMQP从0-9-1规范开始具有优先级消息(https://www.rabbitmq.com/amqp-0-9-1-reference.html)。 - Oleg Kuralenko
1个回答

10

如果一个单一队列只支持FIFO服务,那么你需要引入多个队列、中间件或更复杂的消费者来解决问题。

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

如果你的生产者只能使用单一队列,但你可以控制消费者,请考虑在路径中引入扇出路由器。所以,生产者->路由器是单一队列,然后路由器有两个队列提供给消费者。

另外一种解决方法(可能不是最理想的)是让消费者旋转一个线程到队列前端,然后在内部分配工作。就像上文提到的路由器版本一样,但是在单个应用程序内部。这种方法的缺点是在应用程序内部存在多个消息同时进行,这可能会在发生故障时导致恢复变得复杂。

不要忘记考虑低优先级事件被有效地饿死,无论它们是什么,如果其中一些事件应该在还有更高优先级事件等待处理时进行处理。


1
这基本上就是我们在工作中为一个项目实施的策略。采用多个队列来实现分级优先级系统。我们不太担心饥饿问题,因为在这种情况下,我们可以将重要但优先级较低的消息重新发布为更高优先级的消息;大部分冗余工作都以幂等方式处理,以便实现这一点。 - quaternion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接