我正在使用带有弹簧引导的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;
}
我想描述的一些要点:
- Producer:对于低延迟,Batch.size和liner.ms对Producer配置非常重要。尝试设置为最大值
- 消费者:对于高吞吐量,需要增加缓冲区大小
我有这两个改变,但仍然无法实现卡夫卡对我的期望。
- 如何使用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