除了bootstrap.servers、key.serializer和value.serializer三个必须参数之外,Java版本的Producer还提供了很多其他重要的参数。
- acks:该参数用于控制producer生产消息的持久性。acks指定了在给producer发送响应前,leader broker必须要确保已成功写入该消息的副本数。当前有3个取值:0、1、all
ack=0:设置成0表示producer完全不理睬leader broker端的处理结果。即producer发送消息后立即开始发送下一条消息。
acks=all或-1:表示发送消息时,leader broker不仅会将消息写入本地日志,同时还会等待ISR中所有其他副本都成功写入各自都本地日志后,才发送响应给producer。
acks=1:是0和all都折中,也是默认的参数值。producer发送消息后,仅leader broker将消息写入本地日志,就发送响应给producer。 - buffer.memory:该参数指定了producer端缓存消息的缓冲区大小,单位是字节,默认值是33554432,即32M。producer发送消息时,会先放在这个缓冲区中,再由专门的发送线程来进行读取缓冲区的数据并进行发送。
- compression.type:设置producer是否启用压缩,默认值是none,即不压缩消息。Kafka的producer端引入压缩后可以显著降低网络I/O传输开销从而提升整体吞吐量,但也会增加producer端的CPU开销。如果broker端的压缩参数设置与producer不同,broker在写入消息时也会额外使用CPU资源堆消息进行解压缩-重压缩操作。目前支持3种压缩:GZIP、Snappy、LZ4。由于Kafka(1.0.0)源码中某个关键的硬编码使得Snappy的表现远不如LZ4。
- retries:broker在处理写入请求时可能因为瞬时的故障而导致消息发送失败。这种时候返回给producer其实也是再重试,所以可以设置此参数让producer内部自动重试,默认值为0,表示不进行重试。但重试可能会造成消息的重复发送,这就要求consumer端可以进行去重。producer默认将多个消息(5个)发送请求存在内存中。如果由于重试造成消息的乱序,为了避免乱序,Java版本的producer可以使用max.in.flight.requets.per.connection参数,一旦将其参数设置为1,即表示producer一次只能发送一个请求。
- batch.size:batch.size参数默认值是16348,即16KB。
- linger.ms:linger.ms参数控制消息发送延迟行为的,默认值为0。表示消息立刻被发送,不需要等待batch被填满。
- max.request.size:该参数控制producer发送请求的大小。如果producer要发送大尺寸的消息,这个参数就需要被设置。默认的1048576字节太小。
- request.timeout.ms:当producer发送请求给broker后,broker需要在规定的时间范围内将处理结果返还给producer。默认值是30秒。也就是说在30秒之辈broker必须返回响应给producer,否则抛出TomeoutException给Producer。
网友评论