【Kafka精进系列005】Kafka生产者流程客户端消息发送过程解析

本文详细探讨KafkaProducer的工作原理,从KafkaProducer的介绍、消息发送流程到关键概念如Cluster、Metadata、Metrics、RecordAccumulator和Sender。通过源码分析,揭示KafkaProducer如何序列化消息、选择分区策略、缓存消息并最终发送到集群。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前两节博客中,我们已经演示了如何在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<?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值