kafka-broker数据结构

kafka源码地址:https://github.com/apache/kafka
分支:3.0

我们启动kafka broker,通常都是使用 kafka-server-start.sh 脚本。脚本内部最终是调用了kafka.Kafka的main方法,该类位于kafka项目的core模块。

#!/bin/bash

if [ $# -lt 1 ];
then
    echo "USAGE: $0 [-daemon] server.properties [--override property=value]*"
    exit 1
fi
base_dir=$(dirname $0)

... ...

exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"

main方法构造了一个KafkaServer对象,然后调用了startup()方法。

def main(args: Array[String]): Unit = {
    try {
      val serverProps = getPropsFromArgs(args)
      val server = buildServer(serverProps)

      ... ...

      try server.startup()
      catch {
       ... ...
    }
    Exit.exit(0)
  }

下面来介绍一下KafkaServer的数据结构

1. KafkaServer

重要属性:

  • SockerServer 网络模块,监听服务端口(默认9092),处理client、集群中其他broker节点的网络通信。
  • KakfaApis 业务模块,实际处理业务的模块。
  • LogManager ‘日志’管理模块,此处的‘日志’是指存储到磁盘上的消息,而不是程序打印的日志。
  • GroupCoordinator group和offset管理器。
  • KafkaScheduler 后台的任务调度器。

2. SockerServer

重要属性:

  • Acceptor,数量由 listeners 决定,通常是1个。
  • 一组Processor,数量由 num.network.threads 决定。
  • RequestChannel,网络模块和业务模块交换数据的通道。

3. Acceptor

重要属性:

  • jdk nio Selector 获取OP_ACCEPT事件。
  • jdk nio ServerSocketChannel 监听端口,注册OP_ACCEPT事件。
  • 一组Processor, 处理request的Runnable

4. Processor

重要属性:

  • 一个Response的阻塞队列。
  • kafka Selector, 内嵌一个jdk nio Selector,处理OP_CONNECT、OP_READ事件,负责底层的网络io读写。

5. RequestChannel

重要属性:

  • 一个Request的阻塞队列。
  • Map[Int, Processor], value是Processor,key是对应的编号。

重要方法:

  • sendRequest(request: Request), Processor调用该方法向阻塞队列添加Request。Request中包含Processor的编号。
  • receiveRequest(timeout: Long), KafkaRequestHandler调用该方法则塞读Request,然后调用KafkaApis处理。
  • sendResponse(request: Request, response: AbstractResponse, onComplete: Option[Send => Unit]), KafkaApis调用该方法派发Response,根据Request中的编号,发送到对象的Processor的Reponse队列。

6. KafkaApis

重要属性:

  • RequestChannel, 网络模块和业务模块交换数据的通道。
  • ReplicaManager, replica管理器。
  • GroupCoordinator, group和offset管理器。
  • FetchManager, 负责提供FetchContext。

重要方法:

  • handle(Request, RequestLocal), 处理业务的总入口,根据request.header.apiKey找到对应的方法,处理请求。
  • handleProduceRequest(request, requestLocal), 生产消息
  • handleFetchRequest(request), 查询消息
  • metadata相关、apiVersion相关、topic相关、partition相关、offset相关、选举投票相关... ...
kafka-broker数据结构.png

你可能感兴趣的:(kafka-broker数据结构)