Kafka-batch.size属性

本文基于kafka-clients版本2.6.0,不同版本很大可能有不同,但是原理是一样的,我说的不同指的是消息头,或者你可以理解成消息元数据的不同,现在,我要往kafka服务中发送4条数据,假设发送这4条数据的代码是这个样子的

Properties properties = new Properties();
// 只是个例子,所以很多必须属性都没有put进去,本文只为解释batch.size
properties.put("batch.size",129);
properties.put("linger.ms",9999999);
Producer<String, String> producer = new KafkaProducer<>(properties);
//消息1,发送一个字符串,该字符串大小是9个x,1个a,一共10个字节
producer.send(new ProducerRecord<>("我的topic","xxxxxxxxxa"));
//消息2,发送一个字符串,该字符串大小是9个x,1个b,一共10个字节
producer.send(new ProducerRecord<>("我的topic","xxxxxxxxxb"));
//消息3,发送一个字符串,该字符串大小是9个x,1个c,一共10个字节
producer.send(new ProducerRecord<>("我的topic","xxxxxxxxxc"));
//消息4,发送一个字符串,该字符串大小是9个x,1个d,一共10个字节
producer.send(new ProducerRecord<>("我的topic","xxxxxxxxxd"));
while(true){
    
}

下面开始解释batch.size=129是什么意思,见到batch这个单词,说明是批处理,对于kafka的producer来说,batch指的就是多个ProducerRecord实例,一个实例就是new一个ProducerRecord,那么1个new ProducerRecord是多大呢?在本例来说,一个new ProducerRecord是17个字节(消息内容10字节+ProducerRecord元数据7字节),那么本例中,发送4条消息,这4条消息的总大小是
17乘以4=68字节
接下来,kafka会把这4条消息,放到一个batch中,此时,一个batch,它自身也要有自身的相关元数据,这些元数据大小是
61字节(不需要知道为什么,这只是我根据当前版本测试出来的)
68+61=129,所以本次发送的4条数据,封装成batch之后,总大小是129,刚好填满batch.size的129,所以这4条数据会同时发送到kafka服务,下图是一个batch的组成
在这里插入图片描述
接下来,我如果把上面的batch.size改成128,会怎么样呢

properties.put("batch.size",128);

重新执行程序,
当代码执行到消息1的时候,batch的大小是61+17=78,此时小于设定的batch.size=128,所以producer不会发送消息到kafka
当代码执行到消息2的时候,batch的大小是78+17=95,此时小于设定的batch.size=128,所以producer不会发送消息到kafka
当代码执行到消息3的时候,batch的大小是95+17=112,此时小于设定的batch.size=128,所以producer不会发送消息到kafka
当代码执行到消息4的时候,batch的大小是112+17=129,此时小于设定的batch.size=128,所以producer 会发送 消息到kafka,但是,第4条消息并不会被发出去,发送出去的是前三条消息, 相当于第4条消息助前3条消息发送出去,之后,第4条消息,会变成batch的第1条数据,等待着消息填满发送出去

接下来,我如果把上面的batch.size改成130,会怎么样呢

properties.put("batch.size",130);

这种情况,有上文可知,四条数据加一起是129字节,没有填满130字节,所以消息不会发送出去,要等待第5条数据助前4条数据一臂之力,但是和上面的道理相同,第5条数据送前4条数据发送出去之后,第5条数据本身不会发送出去,它继续等待帮助他填满batch的人。。。。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值