KafKa生产端在初始化的时候都做了什么

文章详细描述了KafkaProducer在初始化时进行的配置设置,如clientId、分区器、元数据等,以及关键组件如消息缓冲区、NetworkClient和Sender的初始化过程。它强调Producer并不会在初始化时主动拉取集群元数据,而是在使用时根据配置获取。
摘要由CSDN通过智能技术生成

kafka相关组件

系统通过KafKaProducer去发送消息,其中KafkaProducer包括一些核心的资源,例如线程资源,网络资源等等。其结构主要包含着

  • 分区器 Partitioner 用于判断发送的消息应该路由到哪一个topic的分区中
  • 最大请求size maxRequestSize
  • 总内存容量 totalMemorySize
  • 元数据 metadata kafka-client中的非常重要的核心部件,记录Broker中的Topic信息, Topic->Partitions(Leader+Followers, ISR), 默认每5分钟刷新一下元数据信息
  • 消息缓冲区 accumulator,负责消息的缓冲,发送到每一个分区的消息会被处理成一个一个的batch,在发送的时候多个batch会打包成为一个request,通常batch size(16kb)
  • 消息发送器 sender,负责将缓冲区中的消息发送到broker中去
  • key和value的序列化器keySerializer,valueSerializer
  • 最大阻塞时间 maxBlockTimeMs

初始化的时候都做了什么

  1. 设置clientId,partitioner,metadata,maxRequestSize,totalMemorySize,compressionType,maxBlockTimeMs 等配置的信息
  2. 初始化消息缓冲区
this.accumulator = new RecordAccumulator(config.getInt(ProducerConfig.BATCH_SIZE_CONFIG),
                    this.totalMemorySize,
                    this.compressionType,
                    config.getLong(ProducerConfig.LINGER_MS_CONFIG),
                    retryBackoffMs,
                    metrics,
                    time);
  1. 初始化网络通信客户端(也是kafka客户端因为NetworkClient 实现了KafkaClient)
    网络通信的组件,NetworkClient,一个网络连接最多空闲多长时间(9分钟),每个连接最多有几个request没收到响应(5个),重试连接的时间间隔(50ms),Socket发送缓冲区大小(128kb),Socket接收缓冲区大小(32kb)
NetworkClient client = new NetworkClient(
                    new Selector(config.getLong(ProducerConfig.CONNECTIONS_MAX_IDLE_MS_CONFIG), this.metrics, time, "producer", channelBuilder),
                    this.metadata,
                    clientId,
                    config.getInt(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION),
                    config.getLong(ProducerConfig.RECONNECT_BACKOFF_MS_CONFIG),
                    config.getInt(ProducerConfig.SEND_BUFFER_CONFIG),
                    config.getInt(ProducerConfig.RECEIVE_BUFFER_CONFIG),
                    this.requestTimeoutMs, time);
  1. 初始化消息发送器
this.sender = new Sender(client,
                    this.metadata,
                    this.accumulator,
                    config.getInt(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION) == 1,
                    config.getInt(ProducerConfig.MAX_REQUEST_SIZE_CONFIG),
                    (short) parseAcks(config.getString(ProducerConfig.ACKS_CONFIG)),
                    config.getInt(ProducerConfig.RETRIES_CONFIG),
                    this.metrics,
                    new SystemTime(),
                    clientId,
                    this.requestTimeoutMs);

同时会将调用sender.run作为守护线程,用于不停的从缓冲区中读取数据,并发送

this.ioThread = new KafkaThread(ioThreadName, this.sender, true);
this.ioThread.start();
  1. 设置序列化器以及拦截器

KafkaProducer在初始化的时候会不会拉取集群元信息

不会,不会去broker上去拉取元数据的,而是等到实际用的时候没有元数据再去拉取吗,但是也是对元数据做了一些初始化的,将配置中的broker地址转化为Node,放置在了Cluster的对象实例中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值