mirror of
https://github.com/didi/KnowStreaming.git
synced 2026-01-10 00:42:07 +08:00
2.7 KiB
2.7 KiB
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集群;
4、类图
数据流转中的组件:
- ProducerInterceptors:拦截器;
- Serializer:序列化;
- Partitioner:分区器;
- RecordAccumulator:消息累加器;
5、总结
本节概要的给大家介绍了一下Kafka生产者客户端,其中非常多的细节没有进行分析,比如:
- 日常问题:如何做消息有序性、常见异常原因及如何解决;
- 架构合理:是否会导致Broker出现热点、
- 性能消耗:CPU和内存的消耗是否合理;
