Files
KnowStreaming/docs/zh/Kafka分享/Kafka生产者客户端_整体概述/Kafka生产者客户端_整体概述.md
2023-02-14 14:57:39 +08:00

2.7 KiB
Raw Blame History

Kafka生产者客户端——整体概述


1、前言

本次分享将会基于社区Kafka 2.5版本,简单介绍下生产者的设计架构与消息发送流程。


2、使用例子

开始分享前,我们先来看一个简单的生产者客户端的代码示例:

public class ProducerTest {  
    public static void main(String[] args) {
        // 生产者客户端配置
        Properties props = new Properties(); 
        props.put("bootstrap.servers", "xxx.xxx.xxx.xxx:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("compression.type", "lz4"); 
        props.put("linger.ms", 500);
        props.put("batch.size", 100000);

        // 创建Kafka生产者客户端
        Producer<String, String> producer = new KafkaProducer<>(props);
        
        String topicName = "logi-km";
        String msg = "hello kafka";

        // 往指定Topic发送数据
        for (int i = 0; i < 1000; i++) {
            producer.send(new ProducerRecord<String, String>(topicName, msg));
        }

        // 关闭生产者客户端
        producer.close();
    }
}

3、数据流转

生产者客户端的使用例子还是非常简单的包含配置等代码仅有短短的50行代码那么这么一个简单的例子背后是如何将数据发送到Kafka的呢

这里之前有个同学画了一个图,觉得还是非常清晰的,本文就直接拷贝过来了。

 

从这个图中,我们可以很清晰的看到,生产者客户端主要有两个线程,分别是主线程(主线程允许有多个)和Sender线程(一个客户端仅有一个)。

  • 主线程:将数据数据生产到RecordAccumulator中;
  • Sender线程RecordAccumulator获取数据,然后通过Networkclient将数据发送给Kafka集群

producer_send_progress


4、类图

数据流转中的组件:

  • ProducerInterceptors拦截器
  • Serializer序列化
  • Partitioner分区器
  • RecordAccumulator消息累加器

5、总结

本节概要的给大家介绍了一下Kafka生产者客户端其中非常多的细节没有进行分析比如

  1. 日常问题:如何做消息有序性、常见异常原因及如何解决;
  2. 架构合理是否会导致Broker出现热点、
  3. 性能消耗CPU和内存的消耗是否合理