Kafka生产者是如何发送数据的?

本文详细描述了生产者在Kafka中如何通过main和sender线程协作,涉及数据发送过程中的拦截器、序列化、分区、batchsize和linger.ms控制,以及如何通过节点发送、ack应答机制确保数据可靠传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产者发送数据有两个线程:一个是main,一个是sender,main线程主要是将数据放入缓冲区中,sender数据主要是将数据发送到broker.

首先maIn线程线程经过send方法,这个过程中会经过拦截器(对数据进行处理),序列化器(数据需要在不同的节点存储和传递),分区器,这个是指定数据存放在哪个分区,在RecordAccumulator里面有几个分区就有几个队列,这里会将相应的数据放进去。

其次是sender线程,我们知道kafka数据并不是一下就发送到broker里面,因为这样会耗费资源,那什么时候发送数据呢,有两个条件:一个是数据的大小达到batchsize 默认16K,那如果数据迟迟没有达到呢,那这种情况下就一直等下去吗,当然不是,linger.ms设置时间,如果达到了linger.ms,即使数据没有达到batchsize。如何发送呢,sender线程发送数据以节点的方式进行发送,比如broker1,broker2,这里就会有两个队列,这里面有一系列的请求,如果broker1的第一个数据没有发送成功呢?这样是不是会产生阻塞呢,不会,最多可以允许发送5个请求。最后通过selector将链路进行打通,进行发送,broker会有ack应答,如果成功了,会将请求清理掉,同时也会将缓存区的数据清理掉。再解释下ack应答:这里有三种应答策略:0是生产者发送的数据,不需要等数据落盘应答。1是需要leader落盘处理才应答。all(-1)需要leader 和isr队列里面的所有节点收齐数据后应答,-1和all应答。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值