Kafka生产者源码分析

从一个Demo入手

我们Kafka源码的doc文档拿下来一个Demo,这个Demo用于向服务端发送消息,从这个例子我们可以知道发送消息是通过生产者的KafkaProducer来完成的,这一篇文章将先完成KafkaProducer的分析

 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
 props.put("acks", "all");
 props.put("retries", 0);
 props.put("batch.size", 16384);
 props.put("linger.ms", 1);
 props.put("buffer.memory", 33554432);
 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 
 Producer<String, String> producer = new KafkaProducer<>(props);
 for(int i = 0; i < 100; i++)
     producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));
 
 producer.close();

初始化过程

先看看KafkaProducer的初始化方法,可以看出KafkaProducer是通过一些键值对的配置来实例化的。

image.png

跟进去,下面这一段是metric,对于我们理解生产者影响不大,忽略掉

image.png

 

设置分区器和重试时间

  • 从配置中读取分区器配,键是partitioner.class。如果设置的话可以通过properties.put("partitioner.class" ,"全类名")来设置,如果用户没有自定义分区器,这里将会使用DefaultPartitioner这个默认的分区器
  • 重试时间通过retry.backoff.ms这个键配置,默认是100ms

 

image.png

设置序列化器

  • key是通过key.serializer来设置的
  • value是通过value.serializer来设置的

 

元数据

  • metadata.max.age.ms:Metadata数据的刷新间隔

image.png

消息大小、压缩格式设置

  • max.request.size:规定每条消息的大小,生产环境必须设置,可以设置为10M
  • compression.type: 数据压缩的类型
    • 默认为空(就是不压缩)。有效的值有 none,gzip,snappy, 或 lz4

 

RecordAccumulator

累加器:

此类充当一个队列,将记录累积到要发送到服务器的MemoryRecords实例中。除非显式禁用此行为,否则累加器使用有限的内存量,并且当该内存耗尽时,追加调用将阻塞。

  • batch.size:默认是32M

image.png

image.png

 

NetworkClient

  • 用于异步请求/响应网络i/o的网络客户端。这是一个内部类,用于实现面向用户的生产者和使用者客户端。该类不是线程安全的!
  • connections.max.idle.ms
    • :默认值是9分钟,一个网络连接最多空闲多久,超过这个空闲时间,就关闭这个网络连接
  • max.in.flight.requests.per.connection
    • 默认是5, producer-> broker 发送数据的时候,其实是有多个网络连接。每个网络连接可以忍受producer端发送broker消息没有响应
    • 因为kafka有重试机制,所以有可能会造成数据乱序,如果要保证数据有序,这个值要设置为1
  • send.buffer.bytes
    • socket发送数据的缓冲区的大小,默认值是128k
  • receive.buffer.bytes
    • socket接受数据的缓冲区的大小,默认值是32K

 

Sender

  • 处理向Kafka集群发送生产请求的后台线程。此线程发出元数据请求以更新其群集视图,然后将产生的请求发送到相应的节点。

image.png

总结

初始化的过程,主要是设置了一些配置,然后初始化了一些重要的类。从初始化的过程,我们也知道生产环境需要修改一些配置来满足生产的需求。

更多源码解读,请扫面下方关注我的公众号!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值