消息优先级是指在一个消息队列中,每条消息都有不同的优先级,一般用整数来描述,优先级高的消息先投递,如果消息完全在一个内存队列中,那么在投递前可以按照优先级排序,令优先级高的先投递。对于优先级问题,可以归纳为两类:
- 只要达到优先级目的即可,不是严格意义上的优先级,通常将优先级划分为高、中、低,或者再多几个级别。每个优先级用不同的 topic 表示,发消息时指定不同的 topic 来表示优先级,这种方式可以解决绝大部分的优先级问题,但是对业务中的优先级精确性做了妥协。
- 严格优先级,优先级用整数表示,例如
0 ~ 65535
,这种优先级问题一般使用不同 topic 解决就非常不合适。
如果要让 MQ 支持严格优先级,会对 MQ 的性能造成非常大的影响。
支持情况
由于 RocketMQ/Kafka 所有消息都是持久化的,所以如果按照优先级来排序,开销会非常大,因此 RocketMQ/Kafka 没有特意支持消息优先级,但是可以通过变通的方式实现类似功能,即单独配置一个优先级高的队列,和一个普通优先级的队列, 将不同优先级发送到不同队列即可。
RabbitMQ 支持优先级概念, 通过数字说明优先级别, 最大支持 255, 在 RabbitMQ 内部, 每个 priority 都是一个 queue, 消息根据优先级路由到相应的 queue 存储, 消费的时候, consumer 先处理完高优先级, 再处理低优先级别, 这样存在 「low priority hungry」 的问题.
问题:如何实现支持优先级的Consumer: Kafka 优先级队列 Kafka 优先级支持 Azure 优先级队列设计模式