如何减少 kafka 生产者和消费者之间的延迟?



我正在使用带有弹簧引导的kafka。我读了很多关于kafka调优的文章,并在生产者和消费者方面进行了一些配置更改。

但卡夫卡仍然花了1.10秒才从生产者传递到消费者。根据卡夫卡的说法,卡夫卡的高延迟编程非常好,但我无法实现。

ProducerConfig:

@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 20000);
props.put(ProducerConfig.LINGER_MS_CONFIG, 1000);
return props;
}

消费者配置

@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(ConsumerConfig.RECEIVE_BUFFER_CONFIG, 502400);
return props;
}

我想描述的一些要点:

  1. Producer:对于低延迟,Batch.size和liner.ms对Producer配置非常重要。尝试设置为最大值
  2. 消费者:对于高吞吐量,需要增加缓冲区大小

我有这两个改变,但仍然无法实现卡夫卡对我的期望。

  1. 如何使用kafka实现高延迟?生产者和消费者有什么具体的配置

任何建议都会对我有所帮助。

有一篇关于Confluent优化Kafka部署的白皮书,详细介绍了如何优化的配置

  • 延迟
  • 吞吐量
  • 耐久性
  • 可用性

您对减少延迟感兴趣。当前配置可能会导致高延迟,因为linger.ms设置为1000(1秒(。此外,batch.size是"0";相当高";这可能导致至少1秒的延迟(从linger.ms开始(

为了减少延迟,您可以通过设置linger.ms=0来强制生产者发送消息,无论消息大小,都不会有任何延迟。

总的来说,白皮书给出了以下建议,这也是我在实践中所经历的,并且可以高度支持:

生产商:

  • linger.ms=0
  • compression.type=none
  • acks=1

消费者:

  • fetch.min.bytes=1

最新更新