当前位置:   article > 正文

【架构】理解 Kafka 高性能背后的原理_kafka一般批量拉取 还是 单个拉取

kafka一般批量拉取 还是 单个拉取

Kafka 是一款性能非常优秀的消息队列,每秒处理的消息体量可以达到千万级别。今天来聊一聊 Kafka 高性能背后的技术原理。

1、批量发送

Kafka 收发消息都是批量进行处理的。我们看一下 Kafka 生产者发送消息的代码:

  1. private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) {
  2. TopicPartition tp = null;
  3. try {
  4. //省略前面代码
  5. Callback interceptCallback = new InterceptorCallback<>(callback, this.interceptors, tp);
  6. //把消息追加到之前缓存的这一批消息上
  7. RecordAccumulator.RecordAppendResult result = accumulator.append(tp, timestamp, serializedKey,
  8. serializedValue, headers, interceptCallback, remainingWaitMs);
  9. //积累到设置的缓存大小,则发送出去
  10. if (result.batchIsFull || result.newBatchCreated) {
  11. log.trace("Waking up the sender since topic {} partition {} is either full or getting a new batch", record.topic(), partition);
  12. this.sender.wakeup();
  13. }
  14. return result.future;
  15. // handling exceptions and record the errors;
  16. // for API exceptions return them in the future,
  17. // for other exceptions throw directly
  18. } catch /**省略 catch 代码*/
  19. }

从代码中可以看到,生产者调用 doSend 方法后,并不会直接把消息发送出去,而是把消息缓存起来,缓存消息量达到配置的批量大小后,才会发送出去。

注意:从上面 accumulator.append 代码可以看到,一批消息属于同一个 topic 下面的同一个 partition。

Broker 收到消息后,并不会把批量消息解析成单条消息后落盘,而是作为批量消息进行落盘,同时也会把批量消息直接同步给其他副本。

消费者拉取消息,也不会按照单条进行拉取,而是按照批量进行拉取,拉取到一批消息后,再解析成单条消息进行消费。

使用批量收发消息,减轻了客户端和 Broker 的交互次数,提升了 Broker 处理能力。

2、消息压缩

如果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/937137
推荐阅读
相关标签
  

闽ICP备14008679号