1、Kafka相关概念
1.1 topic 是消息归纳的基本单位,是一个逻辑概念。 kafka中消息按照topic进行归纳,也就是分类,同一类消息放在同一个topic中,如日志可以有业务A日志,有业务B日志,那么针对业务A和业务B的日志可以建两个topic。
1.2 producer 生产者,负责往topic中写消息
1.3 consumer 消费者,负责从topic中消费消息
1.4 broker 为kafka的服务器,是kafka运行的基本单位,通常集群部署
1.5 partition是topic实际存储的位置,一个topic对应多个partition,也可以只有一个partition。
2、Kafka运行原理
如下图看出一个topic有多个分区,producer根据topic不断往分区中写入数据,consumer设置一个offset从topic取出消息。consumer可以读取已经读取过的消息,kafka不会将已经读取过的消息删除,为了避免消息过多,kafka根据设置的清理时间去定时清理数据。
kafka的优势在于存在多个分区,可以并发写入数据,大大提高了写入速度。而是否多分区对于读的速度没有任何影响,因为即便一个分区读的时间复杂度也为O(1)。
kafka的运行过程:
1)producer写入数据时候,需要指定topic、broker的ip、分区
2)kafka根据key值对应的hashcode将topic写入特定的分区
3)写入完成后通知followers同步消息,followers同步完成后通知consumer消费消息。
3、kafka的存储
kafka的一个topic存储在多个partition,一个partition由多个文件系统组成,如果一个文件系统超过设置最大值后,数据会新建一个新的文件系统,将数据写入其中。文件系统消息的id跟存储逻辑id密切相关,所以kafka读的速度很快,时间复杂度是一个常量级别。
kafka存储位置及两个文件的说明,偏移值所在的位置等。
4、kafka的集群
为了避免一个broker挂掉,影响业务的运行,对kafka进行集群部署(实际部署了几个),集群中一个节点作为leader,其他为followers,任意一个节点充当两个角色,一个是leader,供其他节点负责消息,另外follower,复制其他节点的消息。有消息写入时候,先写入leader,然后同步到followers,同步完成后,再通知consumer消费消息。显然同步的过程影响性能,但是为了系统的可靠性,这点牺牲是必须的。
为了保证leader平均分在各个broker节点,因此集群数量最好等于分区的数量。
5、consumers组
消息的传递方式有两种
1)队列方式
2)发布订阅方式
consumer可以进行分组,一个组中的consumer只能消费一个partition,若只有一个consumer组,那么这些consumer是按照队列方式去消费。若有多个组,组内的consumer按照队列方式消费,组之间的consumer按照发布订阅方式消费。由于一个consumer组只能消费一个partition中的消息,为了保证每个consumer组都能消费到消息,consumer组的数量不能大于partition的数量。
6、kafka的存储