首页 > Kafka常见面试题(一)
头像
小谢backup
编辑于 2021-04-21 18:47
+ 关注

Kafka常见面试题(一)

1、Kafka 可以脱离 zookeeper 单独使用吗?为什么?

kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。

2、kafka 有几种数据保留的策略?

kafka 有两种数据保存策略:基于过期时间和基于存储的消息大小。

3、什么情况会导致 kafka 运行变慢?

cpu 性能瓶颈
磁盘读写瓶颈
网络瓶颈

4、Kafka中的分区器、序列化器、拦截器的处理顺序是什么?

拦截器->序列化器->分区器

5、Kafka为什么不支持读写分离?

如果支持了读写分离,就意味着可能的数据不一致,或数据滞后。

这其实是分布式场景下的通用问题,因为我们知道CAP理论下,我们只能保证C(可用性)和A(一致性)取其一,如果支持读写分离,那其实对于一致性的要求可能就会有一定折扣,因为通常的场景下,副本之间都是通过同步来实现副本数据一致的,那同步过程中肯定会有时间的消耗。

Leader/Follower模型并没有规定Follower副本不可以对外提供读服务。很多框架都是允许这么做的,只是 Kafka最初为了避免不一致性的问题,而采用了让Leader统一提供服务的方式。不过,自Kafka 2.4之后,Kafka提供了有限度的读写分离,也就是说,Follower副本能够对外提供读服务。

6、Java Consumer 为什么采用单线程来获取消息?

首先,Java Consumer是双线程的设计。其中一个线程是用户主线程,负责获取消息;另一个线程是心跳线程,负责向Kafka汇报消费者存活情况。将心跳单独放入专属的线程,能够有效地规避因消息处理速度慢而被视为下线的“假死”情况。

单线程获取消息的设计能够避免阻塞式的消息获取方式。单线程轮询方式容易实现异步非阻塞式,这样便于将消费者扩展成支持实时流处理的操作算子。因为很多实时流处理操作算子都不能是阻塞式的。

另外一个可能的好处是,可以简化代码的开发。多线程交互的代码是非常容易出错的。


7、Kafa consumer 是否可以消费指定分区消息?

可以。Kafa consumer 消费消息时,向 broker 发出"fetch"请求去消费特定分区的消息,consumer
指定消息在日志中的偏移量(offset),就可以消费从这个位置开始的消息,customer 拥有
了 offset 的控制权,可以向后回滚去重新消费之前的消息,这是很有意义的


8、Kafka 消息是采用 Pull 模式,还是 Push 模式?

Kafka 遵循了一种大部分消息系统共同的传统的设计:producer 将消息推送到 broker,consumer 从 broker 拉取消息

9、Kafka中的ISR、AR代表什么?ISR的伸缩又指什么?

ISR:In-Sync Replicas 副本同步队列
AR:Assigned Replicas 所有副本
ISR是由leader维护的,follower从leader同步数据有一些延迟,如果延迟超过阈值就会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。

10、kafka follower如何与leader同步数据?

Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制。完全同步复制要求All Alive Follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率。而异步复制方式下,Follower异步的从Leader复制数据,数据只要被Leader写入log就被认为已经commit,这种情况下,如果leader挂掉,会丢失数据。

kafka使用ISR的方式很好的均衡了确保数据不丢失以及吞吐率。Follower可以批量的从Leader复制数据,而且Leader充分利用磁盘顺序读以及send file(zero copy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减少了Follower与Leader的消息量差。

全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期精华帖

热门推荐