Kafka源码解剖

1、Kafka源码解刨

生产者会将数据封装成ProducerRecord对象,进行序列化操作后便会根据默认分区规则(轮询策略)。分区的数据会获取集群元数据注册broker信息,并通过RecordAccumulator缓存池创建对应的Sender的线程,在该线程中会将请求封装成一个batch,最后在把整个batch数据发送到broker上。

1.1 元数据加载

 1、主线程发送消息尝试拉取元数据,在MateData(元数据管理组件)触发拉取元数据信息后唤醒KafkaThread线程,并同步阻塞等待元数据更新。NetWorkClient会一直获取对应topic的元数据信息,通过Kafka集群进行反馈相应。当KafkaThread的子线程Sender通过NetWorkClient获取到了元数据更新了version的版本号时才能唤醒主线程。

1.2 Producer核心流程

 1、生产者的主线程中会发生ProducerInterceptors(拦截器)在到Serialier(序列化)、最后在进行Partitionor(分区器)。
 2、每一个主题对应着TopicParition主题分区,然后消息通过分区器会进入RecordAcuumulator(缓存池),每一个分区分别对应一个Dqueue队列,在队列存放着RecordBath。在BufferPool(内存池)中会有一个ByteBuffer(大小16k)队列和availableMemory,两个加起来一共32M,然后申请RecordBatch内存对象
 3、在RecordAcuumulator中的Dqueue会找到要发送消息的主机,将请求发送给Sender线程,检查broker是否已经建立好连接,是否可以建立。
 4、Sender线程封装发送到broker的请求,分别存放到inFightRequests的Map>数据结构中和NetworkClient的KafkaChannel中。与此同时Sender线程会建立好SockerChannel连接并进行初始化,通过SelectionKey找到KafkaChannel,KafkaChannel有Slelctionkey和SocketChannel对象通过NIO方式进行相互连通。
 5、NetworkClient通过SelectionKey先KafkaChannel发送请求,是否有需要建立的事件,是否需要发送请求。分别代表着三个事件状态(OP_READ、OP_WRITE、OP_CONNECT),KafkaChannel状态的OP_CONNECT会反馈给NetworkClient通过select的poll反馈到KafkaChannel。而SocketChannel会对Kafka主机完成网络连接发送数据然后反馈。

1.3 响应消息的流转

 1、生产者发送请求ClientRequest通过inFightRequests的Map>数据结构,将对应的broker提交到ClientRequest中。
 2、NetworkReceive通过stagedReceives的Map>数据结构,将对应的broker提交到NetworkReceive中。最后在发送到completeReceives的List数据结构,收到完成消息的请求后会通知inFlightRequests移除里面已经接收的响应请求。最后发送到reponses的List数据结构里面存放的是ClientResponse。

1.4 服务端架构解刨

 1、客户端提交后,服务端会开启Acceptor线程由ServerSocketChannel(9092端口)进行监听请求通过网络NIO标识OP_ACCEPT给Selector,Selector负责创建SocketChannel通过默认的轮询策略请求到Processor线程中,在Processor线程中会创建出连接队列存放着多个SocketChannel并注册OP_REND标识给Selector。
 2、Processor线程不断和SocketChannel进行迭代,receive会通过stagedReceives的Map>数据结构,将对应的broker提交到NetworkReceive中。最后在发送到completeReceives的List数据结构、最后解析请求到RequestChannel。
 3、RequestChannel会有一个requestQueue队列专门存放前面传过来的请求。通过RequestHandlerPool线程的RequestHandler(默认硬件线程大小创建个数)将请求通过工具类顺序写入磁盘中。工具类也封装了相应方法通过Response相应给responseQueues队列,RequestChannel队列是在RequestChannel中的,也会创建对应分区个数的Response队列。RequestChannel队列把成功的请求发送Response。

你可能感兴趣的:(kafka,大数据,java)