kafka原理剖析(5)- broker启动及接收请求

1 Kafka broker 启动
kafka原理剖析(5)- broker启动及接收请求_第1张图片
(1)kafka的broker,代表一个节点,包含多个partition,partition有可能是leader或follower。入口在core包的Kafka类,先后启动KafkaServerStartable 和 KafkaServer , 接着启动了若干组件。每个组件几乎都是封装的线程启动,都是统一风格的startup。

(2)LogManager: 磁盘日志文件操作组件,加载的时候主要负责检查日志目录和加载日志文件,还有几个功能:

a 旧日志段删除  ,超过时间阈值或大小进行删除,
b 物理刷盘功能  ,默认操作系统控制刷盘,也提供配置定时时间刷盘。
c 检查点恢复 检查点checkponit记录最后一次刷盘的offset,异常关闭后可恢复
d 分区目录删除  broker收到stopReplica请求时,删除分区和对应的segment

(3)SocketServer 网络组件,实现的react模式,负责收发请求。

(4)ReplicaManager 副本组件,负责副本管理,包括副本写数据,副本拉数据等。

(5)KafkaController 负责配合zk,选举leader和isr,broker变化处理,分区分配处理等。

(6)GroupCoordinator 负责consummer group管理,包括consummer加入,心跳,离开等。

(7)kafkaRequestHandlerPool是个线程池,KafkaApis是用策略模式封装的工具类,可以处理各类型的请求。

2 kafka broker收发请求的过程

kafka原理剖析(5)- broker启动及接收请求_第2张图片

(1)收发请求,核心是socketServer组件,随着kafkaserver启动一起启动起来,核心是创建了一个Acceptor对象和Processor数组,看名字也能看出来,这个必须是reactor网络模型。

(2)一个acceptor就是个线程,包含了多个processor(默认三个)。
kafka原理剖析(5)- broker启动及接收请求_第3张图片acceptor其实是在nioSelector上注册了accept事件,不断轮训新的accept事件,等待建立连接,

连接设置有:非阻塞连接,禁用tcpdelay(减少延迟),keepalive为true保持连接,

然后把这个新accept出来的channel丢给自己某个processor(多个processor取模轮着给)。
kafka原理剖析(5)- broker启动及接收请求_第4张图片

(3)processor
看上面图,每个processor都有一个selector,还有一个连接队列。从Acceptor里面创建的新连接,都会放入某一个process的连接队列,然后processor的selector对自己的连接队列不断注册事件并处理。收到的请求和处理后的返回,都会放到requestChannel列表里。核心就是线程的run方法如下:
kafka原理剖析(5)- broker启动及接收请求_第5张图片

其中:

 
a  configureNewConnections ( )  ,这里是拿到新连接,注册read事件。
 
b processNewResponses,  从名字就能看出来,是对请求处理完之后的response进行处理,这里有点跳跃,因为处理请求的过程在下面,这里是处理返回,从requestChannel列表里拿到response,通过sendResponse( ) 把response发回到请求方。发送的过程就是先拿到具体的channel,然后通过selector的send,把responseshe 知道kafkaChannel的发送对象里,同时注册op_write事件,后面就是networkClient的网络发送功能了,和producer客户端用的是一套。

c poll方法,kafkaselector的poll 方法,和producer的发送原理一致,通过pollSelectionKeys,处理有事件到达的连接,包括connect事件、read事件、write事件,通过Selector自己封装的一些队列存储中间结果,如compeledReceives代表接受完整的请求,completedSends代表发送完成的请求,stageReceives是暂存队列等。在producer使用的时候都分析过。

d processCompleteReceives 从selector里循环遍历上面的compeledReceives,这里存放了read事件读取好的请求,然后封装成request放入
SocketServer的requestChannel, 这个requestchannel就是个队列,为后面别的线程拿request做准备

e processCompletedSends, 处理发送完成的响应,channel重新关注read事件。

(4)在上图右边,kafkaServer启动时会启动requestHandlerPool, 这个包含了KafkaApis工具类,可以操作各种不同类型请求。这个pool是个线程池,从上面requestChannel拿请求,使用KafkaApis处理,这就是个策略模式的handle处理器,指向了不同方法。

kafka原理剖析(5)- broker启动及接收请求_第6张图片

以prodduce类型为例,调用replicaManager.appendMessages处理完生产者发出的消息后,使用回调方法把response放回到requestChannel里面,核心方法:
requestChannel.sendResponse(new RequestChannel.Response(request, new ResponseSend(request.connectionId, respHeader, respBody)))
后面网络组件就可以进行response的发送了。整个过程就完整了。

你可能感兴趣的:(javakafka)