linux中的缓存 页缓存 pagecatch(读缓存用于提供快速读)块缓存(用于提供其他设备快速写)当对读缓存读的时候,修改了读的数据,页缓存就会被标记为脏数据,等到写的时候它会向块缓存同步数据,并写入到磁盘中
零拷贝:如上kafka读取文件会由操作系统读到页缓存,在读到kafaka的输入缓存,在同步到输出缓存用于写入其他设备,数据写操作会调用系统的块缓存写入,然后再把块缓存数据写到网卡中,这个过程比较耗时,从系统到kafka应用完成多次数据转译,称为多次拷贝,这个过程线程会跨用户态和核心态的代码存在切换额外保存数据的额外消耗。特权指令和非特权指令要求cpu切换状态,内核态和用户态的指令不能跨状体工作 ,切换效率低而且这是一次操作数据量大的时候性能就越低。
kafka使用nio的channel加上buffer的transfrom_to函数实现数据0拷贝,直接将内存数据发送给kafka的消费者。
kafka的应答策略
kafka生产者保证数据发送的安全性,会对消息记录收集校验序列化,放入buff缓存,加快额外的其他数据处理,这些生产的数据会大量的涌入缓存,消息发送器sender,会处理这些数据时无法控制顺序,需要有一个排队机制,sender通过双端队列的方式完成数据的取和网络发送,批发送处理数据最大16k到双端队列中,线程sender负责消费队列的数据,为了保证数据的顺序不丢失发送器引入了在途请求控制器inFilghtRequest默认值为5,是用来网络客户端和网络服务器端的数据请求安全通信的,在途请求不能设置过大,会影响性能,默认值为5,它用来服务端处理数据超时或数据没有被持久化,客户端接收到消息,并控制在在途请求的这个阶段的数据一直保持重试排序,拉取下一批次的偏移量的消息,直到前面的在途请求被有序处理和应答新一轮的批次请求又开始进行,
在途请求的消息会找到存放通道的map,找到符合当前生产者的通道,channel使用java的nio在发送的时候利用nio多路复用器和buffer的零拷贝机制,减少资源消耗,socketChannel将数据发送到网络。
消费者组件