kafka环境搭建步骤:
1、在github上下载kafka,版本为0.10.1,直接下载zip包
2、在win上安装Scala 2.10.6,下载地址:https://www.scala-lang.org/download/2.10.6.html
3、查询build.gradle文件中的gradleVersion = “4.8.1”,然后下载对应的gradle版本
下载地址:https://gradle.org/next-steps/?version=4.8.1&format=all
4、下载3.4.9 zookeeper并启动
5、在idea中下载Scala plugin插件
6、打开kafka-0.10.1项目
6.1 把config目录下的log4j.properties给放到core子项目的src/main/scala目录下去,这样才能看到服务端运行起来的程序打印出来的日志
6.2 修改 config目录下的server.properties,修改log.dirs,这个是配置kafka的日志存储目录的;修改zookeeper.connect,连接到zookeeper
7、在IntelliJ IDEA里启动kafka,Kafka的启动类是“kafka.Kafka”,他是要读取“server.properties”文件的,必须给他指定这个文件的所在位置才可以
点击“Edit Configuration”菜单,选择“+”号,然后选择“Application”,“Name”输入为“Kafka”,“Main Class”输入为“kafka.Kafka”,“Program arguments”输入为“config/server.properties”,“use classpath of module”输入为“core_main”
1、keepalive参数和tcpNoDelay参数的作用
1、keepalive
keepalive的意思,主要是避免客户端和服务端任何一方如果断开连接之后,别人不知道,一直保持着网络连接的资源;所以设置这个之后,2小时内如果双方没有任何通信,那么发送一个探测包,根据探测包的结果保持连接、重新连接或者断开连接
2、tcpNoDelay
TcpNoDelay,如果默认是设置为false的话,那么就开启Nagle算法,就是把网络通信中的一些小的数据包给收集起来,组装成一个大的数据包然后再一次性的发送出去,如果大量的小包在传递,会导致网络拥塞
如果设置为true的话,意思就是关闭Nagle,让你发送出去的数据包立马就是通过网络传输过去,所以这个参数大家也要注意下
2、初始化与broker的连接代码入口
org.apache.kafka.clients.NetworkClient#ready
========================================》
org.apache.kafka.clients.NetworkClient#initiateConnect
========================================》
org.apache.kafka.common.network.Selector#connect
3、poll方法发送请求代码入口
org.apache.kafka.common.network.Selector#pollSelectionKeys
========================================》
Send send = channel.write();
========================================》
org.apache.kafka.common.network.KafkaChannel#write
========================================》
org.apache.kafka.common.network.KafkaChannel#send
========================================》
org.apache.kafka.common.network.ByteBufferSend#writeTo
========================================》
4、解决读取响应的粘包拆包问题代码入口
this.selector.poll(Utils.min(timeout, metadataTimeout, requestTimeoutMs));
========================================》
org.apache.kafka.common.network.Selector#poll
========================================》
org.apache.kafka.common.network.Selector#pollSelectionKeys
========================================》
while ((networkReceive = channel.read()) != null)
========================================》
org.apache.kafka.common.network.KafkaChannel#read
========================================》
org.apache.kafka.common.network.KafkaChannel#receive
========================================》
org.apache.kafka.common.network.NetworkReceive#readFrom
========================================》
org.apache.kafka.common.network.NetworkReceive#readFromReadableChannel