Kafka基本概念
一.消息
这里的消息可以看做数据库里的一个“数据行”或“一条记录”。消息由字节数组组成,对Kafka来说消息里的数据没有特别的格式或含义。消息可以有一个可选的元数据--键,键也是一个字节数组,当消息以可控方式写入不同分区时,会用到键。如为键生成一个一致性散列值,对分区数进行取模,从而为消息选择写入的分区。
二.主题(topic)与分区(partition)
Kafka的消息通过topic进行分类。topic可以被分为若干个partition,一个partition就是一个提交日志。消息以追加的方式写入partition,然后以先入先出的顺序读取消息。
1.一个topic包含多个partition,因此无法再整个topic范围内保证消息的顺序,但可以保证消息在单个partition内的顺序。如下图所示的topic共有4个partition,消息被追加写入每个partition的尾部。partition可以分布在不同的服务器上,使得topic可以横跨多个服务器,以此来提供比单个服务器更为强大的性能。
三.生产者和消费者
1.生产者
生产者(producer)创建消息。生产者在默认情况下把消息均衡地分分布到topic的所有partition上,而不关心特定消息会被写到哪个partition。特定情况下会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现。
2.消费者
消费者(consumer)读取消息。消费者订阅一个或多个主题,按照消息生成的顺序读取它们。消费者通过检查消息的偏移量来区分已经读取过的消息。
2.1偏移量是另一种元数据,是一个不断递增的整数值,在创建消息时,生产者会把它添加到消息里。在给定的partition中,每个消息的偏移量都是唯一的。消费者将每个partition最后读取的消息的偏移量保存在Zookeeper或Kafka上,如果消费者关闭或者重启,它的读取状态不会丢失。
2.2 消费者群组。消费者是消费者群组的一部分,一个群组内的消费者会共同读取一个topic。但群组保证每个topic只能被一个消费者消费。如下图中
群组中共有三个消费者同时读取一个topic的消息,其中两个消费者各消费一个partition,另一个消费者消费其他两个partition。消费者与partition之间的映射关系被称为消费者对partition的所有权关系。