Kafka源码分析之KafkaProducer

        KafkaProducer是一个Kafka客户端实现,可以发布记录records至Kafka集群。KafkaProducer是线程安全的,多线程之间共享单独一个producer实例通常会比多个producer实例要快。KafkaProducer包含一组缓存池空间,存储尚未传输到集群的记录records,同时,一个后台的I/O线程负责将这些记录转换成请求,并发送至集群。使用之后关闭producer失败将会导致这些资源泄露。

        我们看下KafkaProducer都有哪些成员变量,如下:

    // 客户端ID:clientId
    private String clientId;
    
    // 分区器Partitioner实例partitioner
    private final Partitioner partitioner;
    
    // 最大请求大小maxRequestSize
    private final int maxRequestSize;
    
    // 内存总计大小totalMemorySize
    private final long totalMemorySize;
    
    // 集群元数据Metadata实例metadata
    private final Metadata metadata;
    
    // 记录收集器RecordAccumulator实例accumulator
    private final RecordAccumulator accumulator;
    
    // 后台发送线程Sender实例sender
    private final Sender sender;
    
    // 指标度量
    private final Metrics metrics;
    
    // io线程ioThread
    private final Thread ioThread;
    
    // 压缩类型CompressionType实例compressionType
    private final CompressionType compressionType;
    
    private final Sensor errors;
    
    // 时间器
    private final Time time;
    
    // key序列化器keySerializer
    private final Serializer<K> keySerializer;
    
    // value序列化器valueSerializer
    private final Serializer<V> valueSerializer;
    
    // Producer配置信息ProducerConfig实例producerConfig
    private final ProducerConfig producerConfig;
    
    // 最大阻塞时间maxBlockTimeMs
    private final long maxBlockTimeMs;
    
    // 请求超时时间requestTimeoutMs
    private final int requestTimeoutMs;
        其中,比较重要的几个是:

        1、分区器Partitioner实例partitioner:由它负责计算分区,确定主题内的实际存储位置;

        2、集群元数据Metadata实例metadata:存储了整个集群的元数据信息,包括节点列表、主题列表、主题与分区列表映射等信息;

        3、记录收集器RecordAccumulator实例accumulator:通过KafkaProducer发送的消息不会立即被发送到集群,而是先缓存在客户端内存缓冲池中,等待后台I/O线程处理;

        4、后台发送线程Sender实例sender:一个后台工作的I/O线程,由它负责将客户端内存缓冲池中的数据发送到集群;


        KafkaProducer的构造方法

上一篇:Intel Xeon(Cascade Lake) Platinum 8269 2.5GHz 阿里云ECS服务器CPU性能


下一篇:十二、装饰器进阶