消费者与消费组

108 阅读3分钟

一、消费组

消费者负责订阅Kafka中的主题(Topic),并且从订阅的主题上拉取消息,在Kafka的消费理念中,还有一层消费组(Consumer Group)的概念,每个消费者都有一个对应的消费组,当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者。

假设目前某消费组只有一个消费者C0,订阅了一个主题,这个主题包含7个分区:P0、P1、P2、P3、P4、P5、P6,也就是说,这个消费者C0订阅了7个分区,如下图:

graph BT
C0 --> P0
C0 --> P1
C0 --> P2
C0 --> P3
C0 --> P4
C0 --> P5
C0 --> P6

此时消费组内又加入了一个新的消费者C1,按照既定的逻辑,需要将原来的消费者C0的部分分区分配给消费者C1消费,消费者C0和C1各自负责消费所分配的分区,彼此之间并无逻辑上的干扰。如下图

graph BT
C0 --> P0
C0 --> P1
C0 --> P2
C0 --> P3
C1 --> P4
C1 --> P5
C1 --> P6

消费组之间互不影响,每一个分区只能被一个消费组中的一个消费者所消费。

消费者与消费组这种模型可以让整体的消费能力具备横向扩展性,我们可以增加(或减少)消费者的个数来提高(或降低)整体的消费能力。对于分区数固定的情况,一味地增加消费者并不会让消费能力一直提升,如果消费者过多,出现了消费者的个数大于分区个数的情况,就会有消费者分配不到任何分区。

二、消息投递模式

对于消息中间件来说,一般有两种消息投递的模式:

一种是点对点的模式: 点对点的模式是基于队列的,消息生产者发送消息到队列,消息消费者从队列里接收消息。

一种是发布订阅模式: 发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者从主题中订阅消息,主题使得消息的订阅者和发布者互相保持独立,不需要进行接触即可保证消息的传递。发布和订阅模式在消息的一对多广播时采用。kafka同时支持两种消息传递的模式,而这正是得意与消费者与消费者组模型的契合。

如果所有的消费者都隶属于同一个消费组,那么所有的消息都会被均衡的投递到每一个消费者,即每一个消息只会被一个消费者处理。这就相当于点对点的模式。

如果所有的消费者都隶属于不同的消费组,那么所有的消息都会被广播到所有的消费者,即每条消息都会被所有的消费者处理,这就相当于发布和订阅模式的应用。