从一个Demo入手
我们Kafka源码的doc文档拿下来一个Demo,这个Demo用于向服务端发送消息,从这个例子我们可以知道发送消息是通过生产者的KafkaProducer来完成的,这一篇文章将先完成KafkaProducer的分析.
Properties
初始化过程
先看看KafkaProducer的初始化方法,可以看出KafkaProducer是通过一些键值对的配置来实例化的。
跟进去,下面这一段是metric,对于我们理解生产者影响不大,忽略掉
设置分区器和重试时间
- 从配置中读取分区器配,键是partitioner.class。如果设置的话可以通过properties.put("partitioner.class" ,"全类名")来设置,如果用户没有自定义分区器,这里将会使用DefaultPartitioner这个默认的分区器
- 重试时间通过retry.backoff.ms这个键配置,默认是100ms
设置序列化器
- key是通过key.serializer来设置的
- value是通过value.serializer来设置的
元数据
- metadata.max.age.ms:Metadata数据的刷新间隔
消息大小、压缩格式设置
- max.request.size:规定每条消息的大小,生产环境必须设置,可以设置为10M
- compression.type: 数据压缩的类型
- 默认为空(就是不压缩)。有效的值有 none,gzip,snappy, 或 lz4
RecordAccumulator
累加器:
此类充当一个队列,将记录累积到要发送到服务器的MemoryRecords实例中。除非显式禁用此行为,否则累加器使用有限的内存量,并且当该内存耗尽时,追加调用将阻塞。
- batch.size:默认是32M
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集群发送生产请求的后台线程。此线程发出元数据请求以更新其群集视图,然后将产生的请求发送到相应的节点。
总结
初始化的过程,主要是设置了一些配置,然后初始化了一些重要的类。从初始化的过程,我们也知道生产环境需要修改一些配置来满足生产的需求。
喜欢就点个关注呗!