producer端
batch.size 是producer批量发送的基本单位,同一个分区的多条消息会封装进一个batch。默认是16KB,当batch满才会发送batch中所有消息。
linger.ms是sender线程在检查batch是否ready时候判断有没有过期,默认是0ms,超过该值就会直接发送batch,以保证延时不会太高。
compression.type,有GZIP,SNAPPY,LZ4以及none。发送的消息是否被压缩。如果压缩可以有效降低网络IO,但是也会增加producer和broker的CPU开销。
ack,用于控制消息的持久性,存在-1(等待包括Leader的所有ISR副本成功写入才响应producer),0(producer完全不等待leader处理结果直接返回),1(leader副本写入就返回响应给producer)三个参数。
retries,该参数默认0,大于0表示请求失败时自动重试,重试间隔由retry.backoff.ms指定,默认100ms。重试可能带来两个问题:
- 消息重发,比如网络抖动使得broker端实际已经成功写入,只是因为网络没有及时响应给producer,这种由精确一次处理;
- 消息乱序,通过max.in.flight.requets.per.connection设置1,确保一个broker连接上某时刻只能发生一个请求,若socket存在未完成请求,producer不会新发请求。
buffer.memory,用于缓存消息的缓冲区打一下,默认32MB。producer主线程负责封装,序列化,分区,发送消息到缓冲区;sender线程负责从缓冲区读取消息封装进一个batch
max.request,size,用于控制producer发送请求的大小,即能够发送的最大消息大小。
request.timeout.ms,等待broker反应时间默认是30s。如果超过该时间视作请求超时。
consumer端
fetch.min.bytes,控制leader每次返回给consumer的最小数据字节数。同理还有fetch.max.bytes。
session.timeout.ms,condinator检测consumer崩溃的时间,默认10s。
max.poll.interval.ms,consumer处理逻辑所需的最大时间。
enable.auto.commit,consumer是否自动提交位移,对于有较强精确处理语义要求的设置为false,由用户自己手动进行位移提交。
heartbeat.interval.ms,coodinator对于consumer心跳请求的响应时间,一般越快越好。一般小于session.timeout.ms,否则会以为consumer已经dead。
connections.max.idle.ms,控制关闭空闲socket连接的时间,默认9分钟。
broker参数
num.replica.fetchers,该值控制了broker端follow副本从leader副本拉取消息的最大线程数,对于ack=-1的producer而言,主要的延时基本上就是follow与leader的同步,故在ack=-1时该值越大越好。