Kafka源码解析(一)core.kafka.server.KafkaServer

本文深入解析Kafka源码,从启动命令开始,逐步剖析KafkaServerStartable和KafkaServer的核心功能,包括启动过程、Zookeeper连接、shutdown流程及controlledShutdown操作。详细探讨了BrokerState、SocketServer、ReplicaManager等关键组件的初始化与交互。
摘要由CSDN通过智能技术生成

前言:四月份读了半个月kafka源码,提了几个patch,写了一个KIP,至于能不能接受就另说了。距离四月份现在已经3个月了,源码阅读时的一些领悟感觉开始渐渐淡忘了,是时候写些东西巩固巩固了,所以我想写一个系列。开始时准备先写kafka0.8.2.2,原因是代码量比较少,很裸,而且后续版本都是在这个版本的设计思想基础上搭建的。文章准备从kafka的启动开始深入,之后慢慢扩展到生产消费。

1. kafka的启动命令

在启动kafka的一个broker时,我们会使用kaka-server-start.sh脚本。

kafka bin目录下的sh脚本都会调用kaka-run-class.sh,kaka-server-start.sh也不例外。

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

可以看出kafka启动时是调用kafka.kafka类。

同时kaka-server-start.sh中下面的代码值得注意

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi

说明kafka的broker默认JVM大小为1G

同时我们看一下kaka-run-class.sh的这句话

if [ -z "$KAFKA_HEAP_OPTS" ]; then
  KAFKA_HEAP_OPTS="-Xmx256M"
fi

kaka-run-class.sh对其他命令,如创建topic等,默认开256M大小的JVM

2. core.kafka.kafka

core.kafka.kafka的代码比较简单。

object Kafka extends Logging {
   

  def main(args: Array[String]): Unit = {
    if (args.length != 1) {
      println("USAGE: java [options] %s server.properties".format(classOf[KafkaServer].getSimpleName()))
      System.exit(1)
    }

    try {
      val props = Utils.loadProps(args(0))
      val serverConfig = new KafkaConfig(props)
      KafkaMetricsReporter.startReporters(serverConfig.props)
      val kafkaServerStartable = new KafkaServerStartable(serverConfig)

      // attach shutdown handler to catch control-c
      Runtime.getRuntime().addShutdownHook(new Thread() {
        override def run() = {
          kafkaServerStartable.shutdown
        }
      })

      kafkaServerStartable.startup
      kafkaServerStartable.awaitShutdown
    }
    catch {
      case e: Throwable => fatal(e)
    }
    System.exit(0)
  }
}

开始先判断一下是否提供了server.properties,生成一个配置对象serverConfig,

同时声明了一个对象kafkaServerStartable。

使用钩子Runtime.getRuntime().addShutdownHook 在control-c时,调用kafkaServerStartable.shutdown。

执行kafkaServerStartable.startup和kafkaServerStartable.awaitShutdown

没什么值得看的,下面进入到KafkaServerStartable看看。

3. core.kafka.server.KafkaServerStartable

这个类没什么好看的,他声明了一个KafkaServer对象。

KafkaServerStartable的所用方法都是调用KafkaServer的方法。

4. core.kafka.server.KafkaServer

这个类十分重要。

先看一下定义的变量:

  private var isShuttingDown = new AtomicBoolean(false)
  private var shutdownLatch = new CountDownLatch(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值