赞
踩
Kafka 是一款性能非常优秀的消息队列,每秒处理的消息体量可以达到千万级别。今天来聊一聊 Kafka 高性能背后的技术原理。
Kafka 收发消息都是批量进行处理的。我们看一下 Kafka 生产者发送消息的代码:
- private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) {
- TopicPartition tp = null;
- try {
- //省略前面代码
- Callback interceptCallback = new InterceptorCallback<>(callback, this.interceptors, tp);
- //把消息追加到之前缓存的这一批消息上
- RecordAccumulator.RecordAppendResult result = accumulator.append(tp, timestamp, serializedKey,
- serializedValue, headers, interceptCallback, remainingWaitMs);
- //积累到设置的缓存大小,则发送出去
- if (result.batchIsFull || result.newBatchCreated) {
- log.trace("Waking up the sender since topic {} partition {} is either full or getting a new batch", record.topic(), partition);
- this.sender.wakeup();
- }
- return result.future;
- // handling exceptions and record the errors;
- // for API exceptions return them in the future,
- // for other exceptions throw directly
- } catch /**省略 catch 代码*/
- }
从代码中可以看到,生产者调用 doSend 方法后,并不会直接把消息发送出去,而是把消息缓存起来,缓存消息量达到配置的批量大小后,才会发送出去。
注意:从上面 accumulator.append 代码可以看到,一批消息属于同一个 topic 下面的同一个 partition。
Broker 收到消息后,并不会把批量消息解析成单条消息后落盘,而是作为批量消息进行落盘,同时也会把批量消息直接同步给其他副本。
消费者拉取消息,也不会按照单条进行拉取,而是按照批量进行拉取,拉取到一批消息后,再解析成单条消息进行消费。
使用批量收发消息,减轻了客户端和 Broker 的交互次数,提升了 Broker 处理能力。
如果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。