我们知道当消息生产者生产的速度快于消费者的消费速度时,会产生大量的消息积压,大多数人的想法是增加消费者的数量来提升消费速度,这个想法在RocketMQ中是可行的,但是在Kafka中不一定可行。为了更方便地分析问题,我们先忽略消费者组的设计,在增加消费者之前,架构设计,请看下图
一个topic下面建立了两个分区,partition-0和partition-1,分别被consumer-0和consumer-1消费,此时消息积压了很多,我们试图增加一个consumer-2,来增加partition的消费速度
你会发现消费速度没有变化,这是因为Kafka在一开始设计Parition的时候,就已经设计成了一个Parition在同一个时刻只能被一个Consumer消费,当消费者数量大于分区数量时,新加入的消费者是消费不到消息的,除非之前的分区数量是小于消费者数量,就像下图所示
Kafka之所以这样设计的原因有以下几点:
所以在水平扩容消费者上面,相对RocketMQ来说不是那么地直接,在Kafka中需要做进一步考虑,多说一句,在RocketMQ中由于业务场景不同,相比Kafka处理的业务场景要复杂地多,所以RocketMQ需要支持消费者的水平扩容,这样就会出现消息竞争,但是为了水平扩容,RocketMQ需要这样做。
对比RocketMQ
RocketMQ在大多数情况下只会被同一个消费者组中的一个消费者实例消费,以保证消息的有序性。
但是在有些情况下,RocketMQ也支持消息负载均衡,即允许同一个MessageQueue被同一个消费者组中的多个消费者实例共同消费,