mq

MQ 系列 消息优先级

刨析rocketMQ的底层实现

Posted by lichao modified on September 29, 2019

消息优先级是指在一个消息队列中,每条消息都有不同的优先级,一般用整数来描述,优先级高的消息先投递,如果消息完全在一个内存队列中,那么在投递前可以按照优先级排序,令优先级高的先投递。对于优先级问题,可以归纳为两类:

  1. 只要达到优先级目的即可,不是严格意义上的优先级,通常将优先级划分为高、中、低,或者再多几个级别。每个优先级用不同的 topic 表示,发消息时指定不同的 topic 来表示优先级,这种方式可以解决绝大部分的优先级问题,但是对业务中的优先级精确性做了妥协。
  2. 严格优先级,优先级用整数表示,例如 0 ~ 65535 ,这种优先级问题一般使用不同 topic 解决就非常不合适。

如果要让 MQ 支持严格优先级,会对 MQ 的性能造成非常大的影响。

支持情况

由于 RocketMQ/Kafka 所有消息都是持久化的,所以如果按照优先级来排序,开销会非常大,因此 RocketMQ/Kafka 没有特意支持消息优先级,但是可以通过变通的方式实现类似功能,即单独配置一个优先级高的队列,和一个普通优先级的队列, 将不同优先级发送到不同队列即可。

RabbitMQ 支持优先级概念, 通过数字说明优先级别, 最大支持 255, 在 RabbitMQ 内部, 每个 priority 都是一个 queue, 消息根据优先级路由到相应的 queue 存储, 消费的时候, consumer 先处理完高优先级, 再处理低优先级别, 这样存在 「low priority hungry」 的问题.

问题:如何实现支持优先级的Consumer: Kafka 优先级队列 Kafka 优先级支持 Azure 优先级队列设计模式