Kafka的各种参数

buffer.memory参数

buffer.memory这个是kafka-producer 缓存池(用的这个CopyOnWriteMap数据结构,无锁,高并发)的大小参数,应该设置多少?默认是多少呢?

比如说每秒300条消息,那么你就需要压测一下,假设内存缓冲就32MB,每秒写300条消息到内存缓冲,是否会经常把内存缓冲写满?经过这样的压测,你可以调试出来一个合理的内存大小。

有个问题?

在缓存期间客户端挂掉,数据是不是丢失了。??????(必然要容忍极端宕机情况下,可能丢失比如几秒钟的数据。??)

batch.size参数

不能太小,也不能太大(会有延时)。需要在这里按照生产环境的发消息的速率,调节不同的Batch大小自己测试一下最终出去的吞吐量以及消息的 延迟,设置一个最合理的参数。

linger.ms参数

“linger.ms”决定了你的消息一旦写入一个Batch,最多等待这么多时间,他一定会跟着Batch一起发送出去。
避免一个Batch迟迟凑不满,导致消息一直积压在内存里发送不出去的情况。

max.request.size参数

这个参数决定了每次发送给Kafka服务器请求的最大大小,同时也会限制你一条消息的最大大小也不能超过这个参数设置的值,这个其实可以根据你自己的消息的大小来灵活的调整。

retries”和“retries.backoff.ms”重试机制

也就是如果一个请求失败了可以重试几次,每次重试的间隔是多少毫秒。

这个大家适当设置几次重试的机会,给一定的重试间隔即可,比如给100ms的重试间隔

acks持久化机制

这个参数可以设置成0、1 和 all。
第一种选择是把acks参数设置为0,意思就是我的KafkaProducer在客户端,只要把消息发送出去,不管那条数据有没有在哪怕Partition Leader上落到磁盘,我就不管他了,直接就认为这个消息发送成功了。

第二种选择是设置 acks = 1,意思就是说只要Partition Leader接收到消息而且写入本地磁盘了,就认为成功了,不管他其他的Follower有没有同步过去这条消息了。

这种设置其实是kafka默认的设置,大家请注意,划重点!这是默认的设置

最后一种情况,就是设置acks=all,这个意思就是说,Partition Leader接收到消息之后,还必须要求ISR列表里跟Leader保持同步的那些Follower都要把消息同步过去,才能认为这条消息是写入成功了。

acks=all 就可以代表数据一定不会丢失了吗?

当然不是,如果你的Partition只有一个副本,也就是一个Leader,任何Follower都没有,你认为acks=all有用吗?当然没用了,因为ISR里就一个Leader,他接收完消息后宕机,也会导致数据丢失。所以说,这个acks=all,必须跟ISR列表里至少有2个以上的副本配合使用,起码是有一个Leader和一个Follower才可以。这样才能保证说写一条数据过去,一定是2个以上的副本都收到了才算是成功,此时任何一个副本宕机,不会导致数据丢失。

参考

https://juejin.im/post/5cdc5c6bf265da038145fd9f
https://juejin.im/post/5cbf2d58f265da0380436fde

-------------本文结束感谢您的阅读-------------