介绍
今天分享kafka的批量发送,在kafka中,生产者发送消息时可以批量发送的,我们知道,消息的发送需要经过网络,网络传输需要消耗时间的,所以如果我们每生产一条消息就发送,那么每一条消息都需要经过一次网络传输,在一般场景下,其实是没有多大的问题的,但是在并发比较大的场景下,性能就不行了。
那么我们想一下,要解决这个问题其实就是尽量减少网络传输,因为网络是不可靠的,如果遇到网络问题,则更加导致性能降低,所以,应该降低网络的传输次数,kafka中,消息可以通过分批的方式发送,下面我们详细介绍。
参数
batch.size
batch.size表示一个消息批次中可包含的最大消息数量。当生产者发送消息时,它们不会立即发送到Kafka,它们会先被缓存在一个待发送的消息队列中, 然后批量发送,batch.size参数指定了一个批次中包含消息的最大数量,对于同一分区的多个消息,会被放到同一个消息批次中,只有达到batch.size数量后才会被发送到Kafka的Broker,batch.size的单位是byte。
linger.ms
linger.ms表示生产者在发送批次之前等待的时间。当生产者把消息放到某个批次中后,它不会立即发送到Kafka。相反,它会等待指定的时间(linger.ms) ,以便其他在同一批次中的消息被添加到该批次中。这个等待时间可以确保Kafka能够处理同一批次中的多个消息,并运行一些批处理优化,例如写入磁盘的优化。
两个参数的关系
这两个参数都是与批量发送相关,它们之间也是有关联的,当发送的消息达到了batch.size设置的值,那么生产者就会将消息发送到broker,此时不用达到linger.ms这个值,当在linger.ms这个时间值批次中没有达到batch.size,消息也会发送到broker。
比如batch.size的值为10240,linger.ms为5000ms,那么如果在2000ms时,分区的批次已经达到了10240字节,这时候,生产者就会将消息发送到broker,如果已经到了5000ms时,分区的批次只达到了8000字节,那么消息也会被发送到broker。
从上面我们可以看出,kafka设计这两个参数是比较比较巧妙的,linger.ms就是为了防止消息批次如果没有达到某个值时,消息一直没有发出去,这时候,成批的消息堆积在生产者的队列中,batch.size就是为了防止生产了一条消息就发送给broker,降低了效率。
怎么去设置这两个参数的值
对于这两个参数的值如何去设置,这个没有一个黄金比例值,这完全是根据我们的业务和数据量等方面去衡量,也需要我们进行测试,然后计算出什么值比较合适,没有完美的值,只有合理的值。
比如我们的系统需要发送很多小消息,比如我们的系统通过kafka来解耦,上游系统处理完业务后,需要将结果通过kafka发动到下游,显然这种业务并不是大数量的业务,是需要马上发送,下游服务马上就要用的场景,所以我们这时候就需要将batch.size调节小,不让消息堆积成批次再发送,如果我们的业务是大数据量的,比如海量的日志需要通过kafka传输,那么如果每来一条,我们就发送一条,那么就会导致效率低下,所以这时候我们应该将batch.size调节大一点,linger.ms的值我们可以根据情况来定。
批量发送的原理
在Kafka中,有一个消息收集器RecordAccumulator,RecordAccumulator中为每个分区维护了一个双端队列,队列中的内容是ProducerBatch,ProducerBatch是ProducerRecord的集合,我们知道kafka生产者发送的消息被封装成ProducerRecord,所以ProducerBatch就是消息的集合,他是一个ProducerRecord批次,每个分区都对应一个批次,图示如下。
我们设置的batch.size值与ProducerBatch的大小有关,它涉及到了内存石可复用,一个分区中有多个ProducerBatch,ProducerBatch中有多个ProducerRecord,当一个ProducerBatch装满后,会再创建一个ProducerBatch,batch.size默认为16kb,linger.ms默认值为0,所以如果使用默认的值,消息到了收集器,马上就发送出去,如果我们进行自定义,那么消息就会按照配置的值进行发送。
总结
上述对kakfa的消息批量发送进行介绍,对相关的参数进行介绍,并且阐述了二者之间的联系,列举了一些批量发送的一些场景,并对批量发送的原理进行解析,批量发送可以提高吞吐量,不过也要根据我们的实际业务场景去衡量。
“
今天的分享就到这里,感谢你的观看,我们下期见。
”
原文始发于微信公众号(刘牌):kafka高性能设计篇-消息批量发送
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/150637.html