上节是讲了kafka的生产者的使用方法。这节是了解下kafka生产者的整体脉络和记录下一些相关参数。


KafkaProducer

拦截器ProducerIntrceptors

序列化器Serializer

分区器Partitioner

消息累加器RecordAccumulator

sender

创建Request

缓存至InFlightRequests

selector发送消息

kafkaCluster


上图便是消息发送的整体脉络,过程就是producer经过拦截器、序列化器和分区器作用后先缓存到消息累加器(RecordAccumulator)中,使得sender线程可以批量发送缓存的消息,sender发送消息时会先将缓存的消息转换成对应node节点的Request请求,转换后的request请求会先在InFlightRequests中缓存一份,表示已经发出去但尚未收到响应的请求。同时request请求会通过selector发送给kafka集群。kafka集群收到request请求并写入消息后再返回给selector响应数据。sender线程接收到响应数据后会将对应InFLightRequests中的缓存请求清理掉。

中间涉及到的消息累加器RecordAccumulator的大小、RecordAccumulator内部消息批量块ProducerBatch的大小、RecordAccumulator内部复用的ByteBuffer的大小、每个node节点对应的InFlightRequests的大小等参数均能通过对应的配置项进行修改。

InFlightRequests可以用来确认Node负载大小,InFlightRequests还未确定的请求数越多,则可认为对应Node的负载越大。可通过这种方式确定出负载最小的Node用于元数据请求更新、消费者组播协议交互等场合。

生产者参数

默认值

参数含义

acks

1

消息成功发送的认定标准。1代表只要leader副本收到即认为成功,0代表无需服务端响应,发送即认为成功,-1或all代表ISR的所有副本都收到才认为成功。0,1,-1对应吞吐性依次降低,但可靠性依次升高

max.request.size

1048586B(1MB)

代表生产者客户端能发送的消息的最大值

retries和retry.backoff.ms

0,100

代表异常时的重试次数与重试间隔

compression.type

none

消息压缩方式

connection.max.idle.ms

540000(ms)

多久之后关闭闲置连接

linger.ms

0

发送ProducerBatch前等待更多消息的时间

receive.buffer.bytes

32768B

socker接收消息缓冲区的大小

send.buffer.bytes

131072B

socker发送消息缓冲区的大小

request.timeout.ms

3000(ms)

Producer等待请求相应的最长时间

bootstrap.servers

连接kafka集群所需的broker地址清单

key.serializer

消息中key对应的序列化类

value.serializer

消息中value对应的序列化类

buffer.memory

33664422(32MB)

生产者用于缓存消息的缓冲区大小

batch.size

16384(16KB)

ProducerBatch可以复用内存区域大小

client.id

KafkaProducer对应的客户端id

max.block.ms

60000

kafkaProducer中send方法或者partitionFor方法在缓冲区已满或无可用元数据时的阻塞时间

partioner.class

org.apache.kafka.clients.producer.internals.DefaultPartitioner

指定分区器

ebable.idempotence

false

是否开启幂等性功能

interceptor.class

设置生产者拦截器

max.in.flight.requests.per.connection

5

限制每个客户端与Node连接最多缓存的请求数

metadata.max.age.ms

300000(5min)

元数据的最大更新间隔

transactional.id

null

设置事务id