前言:四月份读了半个月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(