Kafka 面经

1.使用Kafka如何保证消息不丢失 ?

kafka主要通过三个方面保证消息不丢失,分别是生产者ACK确认机制,Brocker主从复制机制以及消费者手动设置偏移量offset。

1.生产者ACK确认机制

通过设置消息确认的ACKS的不同参数来调整,0 就是只要生产者发送了消息就确认,和 RabbitMQ里消费者确认机制的 None 的作用类似,1 就是只要消息对应分区的leader副本接受到消息了即可,和RabbitMQ里镜像队列的异步复制的作用类似,ALL 就是只有全部副本都接受到了消息才返回ACK,和RabbitMQ里镜像队列的同步复制的作用类似。

2.Brokcer主从复制机制

kafka中的brocker上的topic分为多个分区,每个分区都有多份副本,其中一个为主副本,其余为从副本,主副本复制读写操作,从副本则保证与主副本的一致性,当leader的节点宕机了,则从他没宕机的从副本节点中推举一个新的leader继续运作。

3.手动提交偏移量Offset

如果某一个消费者在消费消息时宕机了,就需要kafka的brocker重新对当前订阅该topic的消费者组划分消费分区,划分分区主要通过offset来感知消息执行到哪里。但是自动提交offset是在某个时间段间隔提交的,当同步的offset比当前消费的消息位置前的话,就会导致重复消费,当同步的offset比当前消费的消息位置后的话,就会丢失中间的消息。

所以消费完毕需要通过手动提交offset去保证分区正确运行,手动提交分为同步提交,异步提交以及混合提交。

同步提交会造成阻塞,效率低,但是可以发起重试,异步提交不会阻塞,效率高,但是失败时不会重试。

所以可以采用混合提交的方式,先是异步提交,当提交失败时就变为同步提交,就可以保证消息的可靠性。

2.消息的重复消费问题如何解决的 ?

消费者是通过offset来定位消费数据的 , 当消费者出现故障之后会触发重平衡, 会为消费者组中的消费者重新分配消费分区, 正常情况下是没有问题的 , 这也是Kafka提供的消费保障机制,但是在重平衡的过程中 , 因为Kafka默认子每隔5S自动提交偏移量 , 那么就有可能会出现消息丢失和重复消费问题。

如果提交偏移量小于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理。

所以消费完毕需要通过手动提交offset去保证分区正确运行,手动提交分为同步提交,异步提交以及混合提交。

同步提交会造成阻塞,效率低,但是可以发起重试,异步提交不会阻塞,效率高,但是失败时不会重试。

所以可以采用混合提交的方式,先是异步提交,当提交失败时就变为同步提交,就可以保证消息的可靠性。

也可以通过给每条消息设置唯一ID,通过幂等性过滤掉已经消费过的消息。

3.Kafka如何保证消费的顺序性 ?

因为同一个Topic,同一时刻内订阅的消费组中只能有一个消费者可以消费同一消息,虽然topic按照分区划分,每个分区都是顺序执行的,但是不能保证消费组的不同分区间的顺序消费。

所以要保证消息消费的顺序性所以需要在生产者发送消息到kafka时,指定分区,或者发送消息使用同一个key,因为是通过key哈希计算出分区的,所以同一个key会分在同一个分区,这样在分区内是顺序执行的。

4.Kafka的高可用机制有了解过嘛 ?

kafka主要通过三个方面保证高可用性,分别是集群,主从复制以及重平衡。

kafka通过集群的方式,每个topic的每个分区和其副本都是分布式部署,即使某个节点宕机也可保证运行。

kafka中每一个分区都有多个副本,每个副本都与leader一致,同时部署到不同节点上。

kafka在运行时,某一个消费组中的某个消费组宕机后,可以通过重平衡分区,将其分区划分到其他消费者处理,以此保证高可用性。

5.Kafka实现高性能的设计有了解过嘛 ?

Kafka高性能主要通过顺序读写,分区并行,消息压缩,批量发送,页缓存以及零拷贝实现。

1.顺序读写,所有消息都是追加写入,免磁盘随机寻址。

2.分区并行,每一个 topic 都分为多个分区,每一个分区由单独的消费者消费,每个Partition独立处理读写请求,可以保证了消息的并行处理。

3.页缓存,直接使用Linux页缓存,避免JVM堆内存拷贝;读取kafka中的消息时,先从页缓存中读取,没有再从磁盘中读取到页缓存中。

4.零拷贝,从页缓存直接通过网卡发送给消费者,避免了页缓存到jvm内存的拷贝,无需通过socket到网卡。

5.消息压缩,通过压缩算法对消息进行压缩。

6.批量发送,生产者批量发送到kafka,消费者从kafka批量读取。

6.Kafka数据清理机制了解过嘛

kafka中的数据存储到磁盘上分为两个文件,一个是索引文件,一个是日志文件。

日志文件是分段存储的,一方面可以支持不同系统下的文件大小,另一方面是方便清理。

日志的清理机制主要分为两个,一个是根据时间,默认是保存7天,当时间到了则清理过期的日志。

另一个是根据大小,默认是1GB,一个topic可以在磁盘上存储的最大容量,当容量满了则开始清理最久的日志文件。

7.使用Kafka如何实现点对点消息和发布订阅消息

点对点消息模式,可以通过一个topic下只有一个消费组实现,因为一条消息只能由消费组中一个消费者消费。

发布/订阅消息模式,可以将多个消费者放入不同的消费组中,这样同一条消息会在不同的消费组中都被消费。

8.kafka的优点

数据吞吐量可以达到百万级别同时还有低延迟,采用分布式架构拥有更高的可用性,采用数据持久化和主从复制的方式拥有很高的可靠性。

你可能感兴趣的:(kafka,分布式)