Kafka介绍
kafka是一个分布式的,基于发布/订阅的消息系统。简单的可以理解kafka是一个消息队列,可以往队列里面写入数据,也可以从队列里面取出数据进行处理。
kafka关键概念
我以自来水厂的例子来解释kafka的相关概念,可能不够严谨,只为方便大家理解。
从前有一家自来水厂(producer)负责把水运输到不同的地方,以供当地的居民(consumer)使用。冬天大家用水较少,但是水厂又一直在送水,导致水浪费了;到了夏天大家用水多,自来水来不及生产,导致居民无水可用。因此需要一个蓄水池(broker),自来水厂将水运输到蓄水池中,居民从蓄水池取水使用。蓄水池通过一个管道(topic)将水运输到不同的小区中
Topic
topic可以理解数据标签,kafka通过topic对数据进行分门别类,就好比上述例子中的管道,使得自来水可以流向不同的地方,而不导致水混在一起。
Producer
生产者,数据的来源,就好比上述例子中自来水厂,水都是从自来水来的。
Consumer
消费者,数据的处理者,就好比上述例子中的居民,居民需要取水喝。
Broker
数据保存的地方,多个broker构成一个kafka集群。就好比上述例子中的蓄水池,生成者生成的数据都保存在broker中。
Topic抽象
topic是一个大的管道,但是为了提供吞吐量,在管道中有设置了许多小的通道(partition),也就是分区。每一个分区都是一个顺序的,不可变的消息队列,并且可以持续添加。每个分区通过一个唯一的offset来标识消息处理的进度。
消费者可以控制offset,例如消费可以控制从最新的数据开始消费,即设置offset为new,也可以从最早的数据开始消费,即设置offset为early
生成者
生产者负责往某个topic写入数据。由于topic有多个分区,数据可能会按照分区的顺序写入,也可以按照某种算法写入对应的分区,这个可以有开发者自己控制。
消费者
消费者负责从topic中读取数据。kafka为消费者提供了一个抽象模型-消费组(consumer group)。消费组可以对应上述例子中小区,每一个居民都是消费者(consumer),同一个小区的居民就是属于同一个消费组。
kafka之所以抽象消费组的概念,是为了兼容两种消费模型,队列模型和发布-订阅模型。对于队列来说,一组消费者从同一个服务器消费数据,一个消息只能由一个消费者消费。在发布-订阅模型中,一个消息被广播给所有的消费者。如果所有的消费者都在一个消费组中,则变成了队列模型;如果每一个消费者都在不同的消费组中,则变成了发布-订阅模型。
在kafka中,一个分区中的消息只能被同一个消费组中一个消费者消费。例如一个topic中有三个分区p1,p2,p3。消费组groupA,只有一个消费者A1;消费者groupB,有4个消费者,B1,B2,B3,B4。则消费情况可能如下所示,
对于消费组groupA,
partition | consumer |
---|---|
p1 | A1 |
p2 | A1 |
p3 | A1 |
由于groupA只有一个consumer,所以所有的分区都由这个consumer消费
对于消费组groupB
partition | consumer |
---|---|
p1 | B1 |
p2 | B2 |
p3 | B3 |
groupB有4个consumer,但是这个topic只有3个partition,所以有一个consumer将消费不到任何数据,除非其中一个consumer挂掉了,剩下空闲的这个consumer才会上位。
一个partition的数据,只能由一个consumer group的一个consumer消费