Kafka-之生产者(kafkaProducer)客户端常用参数释义

Kafka-之生产者客户端常用参数释义

1 kafka常规参数

kafka生产者可以通过一些的参数来提升消息发送的频率以及效率,防止阻塞或者连接kafka集群失败。以下是常用的参数解析

  • buffer.memory

    • 该参数为RecordAccumulator缓冲区的大小,该大小可以让Sender线程可以向kafka集群批量发送数据,从而减少网络传输的资源消耗,提升性能;
    • 默认 buffer.memory=33554432B(32MB)
  • max.block.ms

    • 该参数为kafkaProducer.send()方法的最大阻塞时间,因为假如kafkaProducer发送消息的速度>Sender线程发送到Kafka集群的速度,那么会造成kafkaProducer阻塞或者要么抛出异常;
    • 默认60000ms(60s)
  • batch.size

    • 消息在网络上都是以Byte的形式进行传输,在真正向kafka传输的时候,并不是一条条传输的,而是批次传输,kafka通过java.io.ByteBuffer来实现消息内存的创建和释放;
    • java.io.ByteBuffer频繁的创建和释放比较耗费资源;
    • RecordAccumulator内部还有1个BufferPool,主要是实现Buffer的复用,以实现缓存的高效利用;
    • 不过BufferPool只针对特性大小的ByteBuffer进行管理,其它大小的ByteBuffer不会缓存进BufferPool;
    • batch.size就是决定该ByteBuffer是否被管理的参数大小;
    • 默认为16384B(16KB)

    ProducerBatch的大小并不一定=batch.size,当一个消息流入消息收集器,会找到该分区所对应的Duque双端队列(没有就创建),然后找到队列尾部的ProducerBatch(没有则创建),然后判断该ProducerBatch中是否还能写入到该缓存,如果可以则写入,如果不可以,先评估该消息的大小,如果该消息<=batch.size,那么就按照batch.size创建ProducerBatch,这个ProducerBatch被BufferPool维护复用,如果消息的大小>batch.size,那么就按照评估的大小创建ProducerBatch,该ProducerRecord则不被维护。

    Sender线程会将分区-数据映射 转换成节点-数据的映射格式,这涉及到网络IO层面:

    <分区,Deque<ProducerBatch>> =>><BrokerNode,List<ProducerBatch>>,在封装成后者之后,Sender会进一步封装成<BrokerNodeID,Request>,这些请求会被添加到请求队列inFlightRequests中,然后就可以通过Selector向kafka集群发送请求了。

  • max.in.flight.requests.per.connection

    • 每个连接最多只能处理5个未响应请求,超过该数值,就不会向该连接发送更过的请求了;
    • 默认值为 5

以上的参数都是有默认的参数值,一般能适用于大量的场景,了解他们能对整个kafka生产者有更好的理解,同时便于问题排查和性能调优!

2 kafka重要参数

  • acks

    • 该参数的值表示有多少个副本收到当前消息后,kafka集群才会向客户端回应消息接收情况;

      • ="1"是默认值,当ledaer副本接收到消息之后,回应消息发送成功,在leader崩溃或者leader选举的过程中,生产者是不能发送消息的,kafka会回应一个错误的信息,此时可以选择重新发送消息,保证数据不丢失,但是当leader收到消息,follower还未来得及同步的时候,消息还是有可能丢失,ack="1"是消息可靠性与吞吐量的折中方式;
      • =“0”,生产者发送消息之后不需要等待kafka作出任何响应,如果消息在发送到kafka集群的过程中发生网络异常或者其它情况下,那么很有可能丢失数据,ack="0"能保证最大吞吐量;
      • ="-1"或者"all"表示当所有的ISR中副本都同步了该消息,那么kafka才会向生产者响应成功,这种情况能保证最大可靠性,但也不是完全可靠,如果ISR中只有leader,那么就回到了acks="1"的情况,所以如果为了保证更高的可靠性,那么需要配合min.insync.replicas等参数的联动;
      • ⚠️注意:acks是字符串类型
      //通常使用
      properties.put("acks","1")
      properties.put(ProducerConfig.ACKS_CONFIG,"1")
      
      //而不能使用
      properties.put("acks",1)
      //否则会报以下错误
      org.apache.kafka.common.config.ConfigException:Invalid value 0 for conf gurat on
      acks: Expected value to be a string, but it was a Java.lang.Integer 
      
  • max.request.size

    • 该参数用来限制Producer能向kafka集群发送消息的最大值,默认为1048576B=1MB,这个默认值就能应付绝大多数应用场景,不建议修改

      • 因为该参数通常与其它参数联动,如Broker端的message max.bytes,如果message max.bytes=10B,而max equest.size=20B,假如发送一个15B的消息,此时会报以下异常,这是无法重试的异常。
      org apache kafka.commo errors.RecordTooLargeExcept on The request included a 
      message larger than the max message size the server will accept .
      
  • retries 和 retry.backoff.ms

    • retries 参数用来配置生产者重试的次数,默认值为 0,即在返回异常时不作任何重试动作;如果=1,那么在网络抖动或选举异常时,生产者会重试发送1次,超过一次,抛出异常,而不是一味的抛出异常给生产者的应用程序;
    • retry.backoff.ms,重试还与该参数有关,这个参数默认为100ms,它用来设置2次重试的时间间隔;
    • 在配置参数的时候,可以评估异常恢复的时间,而尽量不要让生产者过早放弃重试操作;
    • kafka能保证一个分区的数据是有序的,但是如果acks!="0"的时候,可以进行消息重试,这样可能出现消息乱序,假如分区A的第一个批次发送失败,批次二发送成功,此时批次一开始重试,然后成功,那么此时消息就乱序了,为了保证分区有序,不要将acks设置为0,而是需要max.in.flight.requests.per.connection配置为1,这样就牺牲了吞吐量。
  • compression.type

    • 该参数用来指定消息的压缩方式,默认为“none”;
    • 该参数还可以配置“snappy、gzip、lz4“,设置压缩能减少网络传输量降低网络I/O,从而提高整体的性能,消息是时间换空间的方式,如果对时间延迟有要求,不建议开启压缩;
  • Connections.max.idle.ms

    • 这个参数是限制多久关闭闲置的连接,默认为540000ms,即 9分钟;
  • linger.ms

    • ProducerBatch等待下一个Record的时间,当ProducerBatch达到一定大小,或者超过linger.ms时间,那么这个ProducerBatch就会被发送;
  • receive.buffe.bytes

  • 这个参数设置Socket接收消息缓冲区(SO_RECBUF)的大小,默认值为32678B,即32KB,如果设置为-1,则使用操作系统的默认值,如果Producer与kafka集群在不同的机房,可以适当的调大该参数;

  • send.buffer.size

    • 这个参数设置Socket发送消息缓冲区(SO_RECBUF)的大小,默认值为131072,即128KB,如果设置为-1,则使用操作系统的默认值,如果Producer与kafka集群在不同的机房,可以适当的调大该参数;
  • request.timeout.ms

    • 该参数代表Producer等待响应的超时时间,默认值为30000ms=30s;
    • 注意该值需要比replica.lag.time.max.ms大,这样可以减少因客户端重试而引起的消息重复的概率;

更多的kafka生产者参数,可以参考kafka官网。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值