Kafka Producer发送端-配置鸟瞰图
kafka 发送消息调用的send方法底层其实是将消息放入了缓冲区,然后是一个单独的线程负责从缓冲区将消息按topic&paritition纬度打包成批次消息,再发送到服务端broker。并在发生可恢复的异常时负责重试。最后用异步Future返回结果。
所以这个流程里有很多配置控制细节。下面是一个鸟瞰图,直观感受有些什么参数参与。

核心参数作用
enable.idempotence | 默认:true。 消息幂等。保证单个producer发送的消息到单个topic单个partition的消息是幂等的。 当设置为true的时候,如下配置: max.in.flight.requests.per.connection 必须小于等于5. retries 大于0 aks 必须设置为 all 。 |
max.in.flight.requests.per.connection | 默认:5 单个producer可以在未收到broker回复前继续发送的批次数量。5即代表着一个producer可以同时发送5批次的消息给broker端。如果是1,相当于此producer只能顺序一批批的发送消息给broker端。前一批发送的消息broker响应之后,才能发送下一批。 |
max.block.ms | 默认:1分钟 调用这些方法时,最大阻塞等待时间。
|
delivery.timeout.ms | 默认:120000 (2分钟) 从调用send,到future真正返回的最大等待时间。 |
buffer.memory | 默认:33554432(32M) 一个producer最多可以用来缓存消息的缓存大小。 如果发送缓慢(比如linger.ms很大,batch.size很小) 就会导致调用send等方法卡住,知道达到(max.block.ms)配置的时间后抛出异常。 |
linger.ms | 默认:0(不延时) 延时等待batch填满的时间,默认0,不等待。 producer的底层是将send方法送来的消息缓存在buffer中,分批次发送。假设很久一段时间内只有一条数据,没有达到规定的一个批次的量。那么要等多久才发送这条消息呢?这个配置就是用来设置这个的。假设设置为了5s。那么最多延时5s,就算不到一个批次的大小也会发送此数据。 |
batch.size | 默认:16384(即16Kb) producer底层一批次发送消息的最大值。 可以设置为0,那么此时就相当于一次只发送一条消息,将极大的限制流量。 |
acks | 默认:all acks=0,proudcer把消息写到socket缓冲区就算发送成功了,不会等待server端响应。 acks=1,proudcer发送消息给leader,leader将收到的消息写到本地log就会响应给producer,不等待同步给follower,算成功。 acks=all,producer发送消息给leader,消息必须在leader和follower全部同步完成,leader才会响应producer发送成功。 |
request.timeout.ms | 默认:30000 (30s) producer等待broker返回结果的最大时长。 超时会根据配置触发重试或者返回异常。 避免broker进行leader&follower同步的时长大于客户端等待时长,造成producer的错误判断。 |
max.request.size | 默认:1048576(1M) 单次请求最大值。 |
retries | 默认:2147483647 高版本次数很大,意思就是默认遇见可恢复的异常无限重试直到达到delivery.timeout.ms阈值。 |
retry.backoff.max.ms | 默认:1000(即1s) 重试的最大间隔,如果retry.backoff.ms设置的比retry.backoff.max.ms还大,那么每次重试的间隔永远恒定用retry.backoff.max.ms。 |
retry.backoff.ms | 默认:100 重试的初始间隔。随着重试次数增加而指数级增加,直到达到retry.backoff.max.ms。 |
官网
Kafka producer configuration reference | Confluent Documentation