Java面试题-kafka

Java面试题-kafka 1.讲一下kafkakafka是一个分布式流处理平台也是一个消息中间件。kafka基于生产者-消费者模型可以实现应用的解耦。主要有以下几个核心概念消息messagekafka的数据单位。主题topickafka中的消息都是以主题进行归类的。分区partition一个主题可以包含多个分区每一个分区都是有序且不可变的消息序列。生产者producer生产者向kafka发送消息负责将数据写入kafka。消费者consumer消费者从kafka获取消息负责从kafka读取消息。broker一个kafka节点就是一个broker。offset消息在分区中的位置索引。2.kafka为什么需要分区负载均衡消息通过指定的分配策略分配到不同的broker上避免单个broker成为性能瓶颈。容错性kafka会将分区数据复制到多个broker上提高系统容错性保证数据的可用性。顺序消费生产者按照顺序发送到同一个分区的消息消费者也会按照这个顺序进行消费。可扩展性当主题数量不断增长时可以增加分区分散负载不需要对系统进行大规模重构。3.kafka如何保证顺序消费发送到单个分区生产者按照顺序将消息发送到单个分区一个分区的数据只能被一个消费者实例消费。单线程消费消费者组中只有一个消费者实例但是实际项目中基本不存在这种情况。kafka事务可以使用kafka的事务严格的进行生产和消费。但是这会牺牲性能和吞吐量。4.如何保证kafka的消息发送到指定的分区在生产消息时直接指定分区号。自定义分区通过实现 Partitioner 类自定义逻辑分区。默认的分区策略基于key进行哈希计算然后与分区数取模得到分区号。5.kafka中消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset1在kafka中消费者提交的是最新的一条消息唯一也就是offset1。主要是为了保证消费者在下次启动时从未消费的消息开始读取防止重复消息。6.kafka中有哪些情况会造成重复消费没有正确的提交位移会造成重复消费。当消费者组内成员数量发生变化时会触发再平衡。再平衡的过程中如果消息已经被处理但是还没有提交位移就会造成重复消费。生产者在发送消息时比如网络问题没有收到broker的确认会重试发送消息。那么消费者在消费时可能就会重复消费。7.那么如何防止重复消费手动提交位移确保消息处理成功后再提交。变更消费者组成员数量时确保没有消息在消费。配置 enable.idempotencetrue 生产者会自动进行去重确保消息只被写入一次。通过kafka事务保证原子性也可以避免消息重复消费。8.说一下acks参数对消息持久化的影响acks 0生产者发送消息后不需要等待broker的确认就认为消息已经发送成功。这种情况下如果broker宕机可能会造成消息的丢失。acks 1生产者发送消息后会等待broker的确认broker返回后消息发送成功。但是broker的返回只是leader副本确认后就返回所以如果leader副本在同步follower副本时发生故障也会造成消息丢失。acks -1/all生产者的消息在所有副本都接收到才会收到broker的确认。这种设置提供了最高的持久化保证即使某个broker发生了故障消息也不会丢失。9.kafka中哪些情况会造成消息漏消费如果消费者进行消费时发生了异常没有正确的处理位移可能会导致消息漏消费。消费者消费能力不足时会导致消息堆积。当堆积的消息超过一定数量或者时间限制时会触发清理机制导致消息被清理继而漏消费。10.kafka的文件存储机制是怎么样的kafka的每个分区对应一个文件夹文件夹中包含两部分文件数据文件和索引文件。数据文件保存着实际的消息数据索引文件保存着消息的偏移量和物理位置的对应关系可以快速的查找某个消息的位置。11. kafka如何保证消息的可靠性分区复制kafka将每个分区的数据副本分布在多个broker上即使某个broker宕机数据仍然能够通过其他broker获取。ISR机制kafka使用ISR机制只有在所有副本已经同步到最新数据时才会将消息标记为已提交这样能够保证所有副本的数据都是一致的。持久化kafka将消息持久化到磁盘中即使出现故障也能够快速恢复。消息重试kafka允许生产者在发送消息时进行重试保证消息不会丢失。消费者位移消费者位移用来记录已经消费的消息位置确保消息不会被重复消费。12.kafka的消息传递机制是pull还是pushkafka采用的是pull模式也就是消费者从broker中主动拉取数据。这样消费者可以自己控制消费的速度和位置避免了消息积压和消费者压力过大。并且可以通过设置重复消费一些消息也保证了消息的一致性和可靠性。13.kafka如何防止如果broker没有可供消费的消息将导致consumer不断在循环中轮询消费者在调用poll()方法消费数据时可以加上timeout参数当返回空数据的时候会在Long Polling中进行阻塞等待timeout再去消费直到数据到达。14. kafka中多个消费者组消费同一个主题会造成重复消费吗正常情况下不会因为每个分区同一时间只会被一个消费者消费。并且因为消费位移的存在处理完消息之后会提交位移其他消费者会根据位移位置开始消费不会重复消费。异常情况下会比如消费者组重新平衡kafka会重新分配分区一些消息可能会被分配给新的消费者造成重复消费。或者消费时发生异常没有正确的提交位移也会导致重复消费。15.kafka为什么性能好、吞吐量大集群架构kafka是一个分布式的集群系统可以将数据分散到不同的节点上进行存储和处理从而实现横向扩展提高系统的处理能力。磁盘存储kafka使用磁盘存储消息存储数据的容量不再受限于内存的大小。批量发送kafka可以将多个消息批量发送到broker上这样可以减少网络传输开销提高系统吞吐量。零拷贝技术kafka适合用零拷贝技术来避免数据拷贝的过程减少了cpu的开销提供系统性能。压缩算法kafka支持多种压缩算法可以对消息进行压缩减少网络传输开销提高系统吞吐量。16.kafka的高可用是怎么实现的kafka分区可以有多个副本副本分为leader副本和follower副本。leader副本负责处理分区的所有读写请求。生产者向分区发送消息时实际上是发送到leader副本消费者从分区读取消息时也是从leader副本读取。follower副本则被动地从leader副本复制数据不处理来自客户端的请求。它们的存在是为了在leader副本出现故障时能够有一个副本可以被提升为新的leader继续提供服务。follower副本会不断地从leader副本拉取消息以保持与leader副本的数据同步。这个过程是通过网络通信实现的。当follower副本成功地复制了一条消息后它会向leader副本发送一个确认消息表示已经成功复制了该消息。leader副本会跟踪所有副本的同步状态以确定哪些副本已经跟上了最新的消息。17.kafka中 leo(log end offset)和hw(high watermark)是什么LEO表示分区中最后一条消息的偏移量即消息在分区中的存储位置。当 Producer 向 Partition 中写入消息时LEO 会不断增加表示消息的写入位置当 Consumer 从 Partition 中拉取消息时LEO 会不断变化表示消息的读取位置。HW表示分区中已经被 Consumer 消费的消息偏移量即消息在 Partition 中的消费位置。当 Consumer 从 Partition 中拉取消息时HW 会不断增加表示已经消费的消息的偏移量当 Consumer 向 Kafka Broker 提交位移时HW 会被更新为提交的位移表示消费者已经消费了该位移之前的所有消息。LEO 和 HW 的关系如下1.LEO HW表示 Partition 中还有未被消费的消息Consumer 可以继续消费这些消息2.LEO HW表示 Partition 中已经没有未被消费的消息Consumer 无法继续消费消息除非有新的消息写入到 Partition 中。LEO 和 HW 的作用如下1.LEO 表示消息的存储位置可以用于监控 Partition 中消息的写入情况2.HW 表示消息的消费位置可以用于监控 Consumer 消费消息的情况以及实现消息传输语义的控制。例如At Least Once 语义中Consumer 可以将 HW 作为提交位移的参考避免消息的重复消费。18.消息被消费后什么时候会进行删除没有及时删除会造成空间占满吗消息被消费后不会立马进行删除而是根据配置的策略进行清除。kafka消息的清除有两种策略一种基于时间一种基于分区大小。没有及时删除当生产者的速度远大于消费者速度时可能会造成空间占满。19.kafka默认的主题有哪些分别做什么用的__consumer_offsets存储消费组的偏移量信息每个消费组消费到每个分区的位置。__transaction_state支持 Kafka 事务功能存储事务的状态信息比如如事务开始、提交、中止等。20.kafka为什么要抛弃zookeeperkafka在3.3.0版本2022 年 6 月发布中正式抛弃了zookeeper使用KRaft模式进行替代。zookeeper本质时一个分布式的协调工具它有一个特点就是强一致性。当集群中的某个节点发生变化时需要通知其他节点进行更新需要等待大多数节点更新完成后才算成功这样性能就有了瓶颈。当kafka集群很大分区很多的时候zookeeper的元数据也会很多性能就差了。并且zookeeper也是需要选举的而且发生选举的这段时间不提供服务。21.kafka消费的时候消费失败怎么办延迟重试机制对于消费失败的消息进行异常捕获利用指数退避策略进行延迟重试。死信队列超过最大重试次数后仍然失败放入死信队列DLQ中。指数退避策略通过指数级增加重试间隔时间核心思想是“失败次数越多下次重试等待时间越长”- 第一次失败后1秒- 第二次失败后2秒- 第三次失败后4秒- 第四次失败后8秒- 第N次失败后2^n-1秒22.如何处理死信队列利用监控工具对死信队列进行监控及时进行告警。判断消费失败的原因一般可能有JSON解析失败、字段类型错误、编码问题等。对消息进行处理后重新进行消费并及时的清理死信队列。23.什么是ISR机制ISR机制是kfaka用于保证数据一致性和可靠性的一种机制。基本原理是每一个分区都有一个leader副本处理读写其他的副本都是follower副本负责数据的备份。follower副本会定期从leader副本拉取最新数据ISR机制保证只有所有的副本都成功拉取到最新数据后消息才会被认为“已提交”。对于消费者因为消费者只能读取已提交的数据所以ISR机制能确保数据的一致性。24.什么情况下副本会被踢出ISR当follower副本无法在规定时间内拉取到leader副本的最新数据就会被踢出ISR。该时间由参数replica.lag.time.max.ms决定默认30秒。