在前两节博客中,我们已经演示了如何在Docker搭建Kafka集群以及实现Kafka的消息发送和接收过程.
本文将深入Kafka Producer的消息发送过程,从源码的角度梳理下Kafka的发送过程。
注:本文Kafka源码版本:1.0.0.
一、KafkaProducer介绍
1、KafkaProducer介绍与使用
KafkaProducer是Kafka的客户端、消息的生产者,用来将消息发往Kafka cluster。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();
2、KafkaProducer属性
// 生产者id
private final String clientId;
// 内部使用的监控模块,负责管理Sensor对象
final Metrics metrics;
// 对同一个操作需要有多方面度量, 比如请求平均时间、错误数等
private final Sensor errors;
// 分区选择器, 用于消息的路由
private final Partitioner partitioner;
// 消息的最大长度,包括消息头+序列化后key+序列化后value的长度
private final int maxRequestSize;
// 发送单个消息缓冲区大小
private final long totalMemorySize;
// 整个Kafka集群的元数据, 被客户端线程共享
private final Metadata metadata;
// 用于收集待发送的数据
private final RecordAccumulator accumulator;
// 用于发送消息的任务, 在ioThread线程中执行
private final Sender sender;
// 调用Sender消息发送任务
private final Thread ioThread;
// 压缩算法:用于消息压缩
private final CompressionType compressionType;
// 时间相关的工具类
private final Time time;
// key和value的序列化类, 可以在ProducerConfig中自定义序列化类
private final ExtendedSerializer<K> keySerializer;
private final ExtendedSerializer<V> valueSerializer;
// 配置类, 用于初始化KafkaProducer
private final ProducerConfig producerConfig;
// Kafka集群metadata更新的最长时长
private final long maxBlockTimeMs;
// 消息发送到接收ACK响应的最长时长
private final int requestTimeoutMs;
// 拦截器, 用于在消息发送前或者回调时的预处理
private final ProducerInterceptors<K, V> interceptors;
// Node版本,Kafka内部使用
private final ApiVersions apiVersions;
// 事务管理
private final TransactionManager transactionManager;
3、KafkaProducer构造器
我们使用最多的KafkaProducer构造器是:
public KafkaProducer(Properties properties) {
this(new ProducerConfig(properties), null, null);
}
在new ProducerConfig()
中会初始化配置:
ProducerConfig(Map<?