KAFKA面试题
1. 生产者如何提高吞吐量
batch.size:批次大小,默认16k
linger.ms:等待时间,修改为5-100ms
compression.type:压缩snappy
RecordAccumulator:缓冲区大小,修改为64m
2. Kafka的生产和消费数据为什么会快,请说说原因
一个topic创建多个partition,一个生产者在发送消息的时候可以进一步提高吞吐量
sender线程是把一批消息发送到pageCache中,
消息是被存储在RecordAccumulator 的recordBatch中,有压缩过程
把pagechache上面的数据定时刷到segment的log日志, 顺序写 segment的log日志, 也保留一些最新的数据,当消费者要消费的数据在pagecache上,就直接消费了,不需要读磁盘了,但也不能把要消费的数据都保存在pageCache上,因为物理机内存有限
用户发起消费,发起sendfile()系统调用,从用户态切换到内核态,要消费的数据是否在pageCache中存在,如果存在就利用CPU拷贝把数据在pageCache中的内存地址、地址偏移量、等描述信息拷贝到socket缓冲区, socket缓冲区会根据这些描述信息利用DMA gather copy把数据copy到网卡设备,sendfile系统调用返回,内核态切换到用户态
3. Kafka生产消息为什么快之PageCache
消息会被打包到一个recordbatch中,一个recordbatch的大小16KB,一个recordbatch被使用完,会申请一个新的recordbatch,一个recordbatch被写满会触发sender线程发送数据 的操作,会把数据发送到pageCache中,发送的最小单位是一个recordbatch,收到broker的ack以后,就会清空recordbatch,脏页4KB,每5s 写入flash一次硬盘,用到了顺序写的技术
直接使用jvm进程中的缓存,内存的开销是很大的,会占用对象真实大小的几倍的大小,还要进行垃圾回收,触发STW
4. Kafka的生产者是如何把一条消息发送到Broker节点的
生产者会把消息封装成ProducerRecord,key不为空,默认key的hashcode值取模获取投递的分区,key相同的分区都会发送到同一个分区。key==null按照轮询方式选择分区
打包压缩成recordBatch再进行发送,16KB,支持某种压缩算法的,linger.ms和batch.size两个参数控制生成一个发送请求