上节是讲了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 |