kafka生产者ack配置

998 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~

生产者中的ack的配置

在同步发送的前提下,生产者在获得集群返回的ack之前会⼀直阻塞。那么集群什么时候返回ack呢?此时ack有3个配置:

  1. ack = 0 :kafka-cluster不需要任何的broker收到消息,就立即返回ack给⽣产者,这是最容易丢消息的,效率是最高的。
  2. ack=1(默认): 多副本之间的leader已经收到消息,并把消息写入到本地的log中,才会返回ack给生产者,性能和安全性是最均衡的。
  3. ack=-1/all :里面有默认的配置min.insync.replicas=2(默认为1,推荐配置⼤于等于2),此时就需要leader和⼀个follower同步完后,才会返回ack给生产者(此时集群中有2个broker已完成数据的接收),这种方式最安全,但性能最差。

image.png

下面是关于ack和重试的配置,如果没有收到ack,就开启重试:

props.put(ProducerConfig.ACKS_CONFIG, "1");

/*
 *发送失败会重试,默认重试间隔100ms,重试能保证消息发送的可靠性,但是也可能造成消息重复发送,⽐如wl络抖动,所以需要在接收者那边做好消息接收的幂等性处理。
 */
props.put(ProducerConfig.RETRIES_CONFIG, 3);

//重试间隔设置
props.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, 300);

关于消息发送的缓冲区

image.png

  • kafka默认会创建⼀个消息缓冲区,⽤来存放要发送的消息,缓冲区是32m;

props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);

  • kafka本地线程会去缓冲区中⼀次拉16k的数据,发送到broker;

props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);

  • 如果线程拉不到16k的数据,间隔10ms也会将已拉到的数据发到broker;

props.put(ProducerConfig.LINGER_MS_CONFIG, 10);