KafKa生产端在初始化的时候都做了什么
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
初始化的时候都做了什么
- 设置clientId,partitioner,metadata,maxRequestSize,totalMemorySize,compressionType,maxBlockTimeMs 等配置的信息
- 初始化消息缓冲区
this.accumulator = new RecordAccumulator(config.getInt(ProducerConfig.BATCH_SIZE_CONFIG),
this.totalMemorySize,
this.compressionType,
config.getLong(ProducerConfig.LINGER_MS_CONFIG),
retryBackoffMs,
metrics,
time);
- 初始化网络通信客户端(也是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);
- 初始化消息发送器
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();
- 设置序列化器以及拦截器
KafkaProducer在初始化的时候会不会拉取集群元信息
不会,不会去broker上去拉取元数据的,而是等到实际用的时候没有元数据再去拉取吗,但是也是对元数据做了一些初始化的,将配置中的broker地址转化为Node,放置在了Cluster的对象实例中。