JAVA面试题--Kafka(最新最全)
- 目录
- 概述
- 需求:
- 设计思路
- 实现思路分析
- 1.URL管理
- 2.网页下载器
- 3.爬虫调度器
- 4.网页解析器
- 5.数据处理器
- 拓展实现
- 性能参数测试:
- 参考资料和推荐阅读
)
Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.
目录
概述
Java 消费者
需求:
设计思路
1.为什么要使用 kafka?为什么要使用消息队列?
1.为什么要使用 kafka?为什么要使用消息队列?
2.Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么?
3.kafka中的broker 是干什么的?
4.kafka中的 zookeeper 起到什么作用?可以不用zookeeper么?
5.kafka follower如何与leader同步数据?
6.什么情况下一个 broker 会从 ISR 中被踢出去?
7.kafka 为什么那么快?
8.kafka producer如何优化打入速度?
9.kafka producer 打数据,ack 为 0, 1, -1 的时候代表啥, 设置 -1 的时候,什么情况下,leader 会认为一条消息 commit 了
10.kafka unclean 配置代表啥?会对 spark streaming 消费有什么影响?
11.如果leader crash时,ISR为空怎么办?
12.kafka的message格式是什么样的?
13.kafka中consumer group 是什么概念?
14.Kafka中的消息是否会丢失和重复消费?
15.为什么Kafka不支持读写分离?
16.Kafka中是怎么体现消息顺序性的?
17.kafka如何实现延迟队列?
18.什么是消费者组?
19.解释下 Kafka 中位移(offset)的作用。
20.阐述下 Kafka 中的领导者副本(Leader Replica)和追随者副本 (Follower Replica)的区别。
21.如何设置 Kafka 能接收的最大消息的大小?
22.监控 Kafka 的框架都有哪些?
23.Broker 的 Heap Size 如何设置?
24.如何估算 Kafka 集群的机器数量?
25.Leader 总是 -1,怎么破?
26.LEO、LSO、AR、ISR、HW 都表示什么含义?
27.Kafka 能手动删除消息吗?
28.consumer_offsets 是做什么用的?
29.分区 Leader 选举策略有几种?
30.Kafka 的哪些场景中使用了零拷贝(Zero Copy)?
31.如何调优 Kafka?
32.Controller 发生网络分区(Network Partitioning)时,Kafka 会怎么样?
33.Java Consumer 为什么采用单线程来获取消息?
34.简述 Follower 副本消息同步的完整流程。
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流2.Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么?
程。只需要遵守约定,针对数据编程即可获取扩展能力。
冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
2.Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么?
AR:Assigned Replicas 所有副本
ISR是由leader维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度, 当前最新的版本0.10.x中只支持replica.lag.time.max.ms这个维度),任意一个超过阈值都会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。
3.kafka中的broker 是干什么的?
broker 是消息的代理,Producers往Brokers里面的指定Topic中写消息,Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,broker在中间起到一个代理保存消息的中转站。
4.kafka中的 zookeeper 起到什么作用?可以不用zookeeper么?
zookeeper 是一个分布式的协调组件,早期版本的kafka用zk做meta信息存储,consumer的消费状态,group的管理以及 offset的值。考虑到zk本身的一些因素以及整个架构较大概率存在单点问题,新版本中逐渐弱化了zookeeper的作用。新的consumer使用了kafka内部的group coordination协议,也减少了对zookeeper的依赖,但是broker依然依赖于ZK,zookeeper 在kafka中还用来选举controller 和 检测broker是否存活等等。
5.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的消息量差。
6.什么情况下一个 broker 会从 ISR 中被踢出去?
leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护 ,如果一个follower比一个leader落后太多,或者超过一定时间未发起数据复制请求,则leader将其重ISR中移除 。
7.kafka 为什么那么快?
Cache Filesystem Cache PageCache缓存
Cache Filesystem Cache PageCache缓存
顺序。 由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。
Zero-copy。零拷技术减少拷贝次数
Batching of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。
Pull 拉模式。使用拉模式进行消息的获取消费,与消费端处理能力相符。
8.kafka producer如何优化打入速度?
增加线程
提高 batch.size
增加更多 producer 实例
增加 partition 数
设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解;
跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。
9.kafka producer 打数据,ack 为 0, 1, -1 的时候代表啥, 设置 -1 的时候,什么情况下,leader 会认为一条消息 commit 了
1(默认):数据发送到Kafka后,经过leader成功接收消息的的确认,就算是发送成功了。在这种情况下,如果leader宕机了,则会丢失数据。
0:生产者将数据发送出去就不管了,不去等待任何返回。这种情况下数据传输效率最高,但是数据可靠性确是最低的。
-1:producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。当ISR中所有Replica都向Leader发送ACK时,leader才commit,这时候producer才能认为一个请求中的消息都commit了。
10.kafka unclean 配置代表啥?会对 spark streaming 消费有什么影响?
unclean.leader.election.enable 为true的话,意味着非ISR集合的broker 也可以参与选举,这样有可能就会丢数据,spark streaming在消费过程中拿到的 end offset 会突然变小,导致 spark streaming job挂掉。如果unclean.leader.election.enable参数设置为true,就有可能发生数据丢失和数据不一致的情况,Kafka的可靠性就会降低;而如果unclean.leader.election.enable参数设置为false,Kafka的可用性就会降低。
11.如果leader crash时,ISR为空怎么办?
kafka在Broker端提供了一个配置参数:unclean.leader.election,这个参数有两个值:
true(默认):允许不同步副本成为leader,由于不同步副本的消息较为滞后,此时成为leader,可能会出现消息不一致的情况。
false:不允许不同步副本成为leader,此时如果发生ISR列表为空,会一直等待旧leader恢复,降低了可用性。
一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成。
header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。
当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性。
body是由N个字节构成的一个消息体,包含了具体的key/value消息。
13.kafka中consumer group 是什么概念?
同样是逻辑上的概念,是Kafka实现单播和广播两种消息模型的手段。同一个topic的数据,会广播给不同的group;同一个group中的worker,只有一个worker能拿到这个数据。换句话说,对于同一个topic,每个group都可以拿到同样的所有数据,但是数据进入group后只能被其中的一个worker消费。group内的worker可以使用多线程或多进程来实现,也可以将进程分散在多台机器上,worker的数量通常不超过partition的数量,且二者最好保持整数倍关系,因为Kafka在设计时假定了一个partition只能被一个worker消费(同一group内)。
14.Kafka中的消息是否会丢失和重复消费?
要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消息消费。
1)消息发送
Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置。Kafka通过配置request.required.acks属性来确认消息的生产:
Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置。Kafka通过配置request.required.acks属性来确认消息的生产:
0—表示不进行消息接收是否成功的确认;
1—表示当Leader接收成功时确认;
-1—表示Leader和Follower都接收成功时确认;
综上所述,有6种消息生产的情况,下面分情况来分析消息丢失的场景:
(1)acks=0,不和Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;
(2)acks=1、同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;
2)消息消费
Kafka消息消费有两个consumer接口,Low-level API和High-level API:
实现思路分析
1.URL管理
这里我们可以使用规则的数据结构来存储和转发。
2.网页下载器
下载器我们可以使用建立HTTP请求把界面的URL元素下载下来。实质就是
下载器。
3.爬虫调度器
爬虫调度器就是可以利用多线程机制,进行调度似的更快的进行网页爬取。
4.网页解析器
这个也比较简单,就是对网页元素进行解析,通常利用JSONP,xpath等技术进行网页分析。
5.数据处理器
在这个过程一般在数据存储和,存储到mysql中,或者进行其他逻辑判断等。
拓展实现
这里参考:github:简单实现上述流程:
入门级实现:
: 部分源码实现.
: 源码实现
性能参数测试:
每秒大概18-20个请求,主要用于网络IO操作耗费了不少时间。
参考资料和推荐阅读
- 爬虫框架的设计与实现之JAVA篇.
- 主流爬虫框架的基本介绍.
- 高拓展性的Java多线程爬虫框架reptile.
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~