如何减少kafka的生产者和消费者之间的延迟?
How to reduce latency between kafka's producer and consumer?
我正在使用带 spring 引导的 kafka。看了那么多kafka调优的文章,在producer和consumer端做了一些配置修改
但是 kafka 仍然需要 1.10 秒才能将一条消息从生产者发送到消费者。根据 kafka,kafka 针对高延迟进行了很好的编程,但我无法实现。
生产者配置:
@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;
}
我想描述的几点:
- 生产者:为了低延迟,Batch.size和liner.ms对生产者配置非常重要。尝试设置为最大值。
- 消费者:为了高吞吐量,需要增加缓冲区大小。
我进行了这两个更改,但仍然无法实现我对 Kafka 的期望。
- 如何使用kafka实现高延迟? producer 和 consumer 有什么具体的配置吗?
任何建议都会对我有所帮助。
Confluent 在 Optimizing your Kafka Deployment 上有一篇很好的白皮书,其中详细解释了如何为
优化配置
- 延迟
- 吞吐量
- 耐用性
- 可用性
您有兴趣减少延迟。您当前的配置可能会导致高延迟,因为 linger.ms
设置为 1000(1 秒)。此外,batch.size
“相当高”,可能导致至少 1 秒的延迟(来自 linger.ms)。
为了减少延迟,您可以通过设置 linger.ms=0
.
强制您的生产者无延迟地发送消息,而不管消息的大小。
总的来说,白皮书给出了以下建议,也是我在实践中亲身体验过的,非常支持:
制作人:
linger.ms=0
compression.type=none
acks=1
消费者:
fetch.min.bytes=1
我正在使用带 spring 引导的 kafka。看了那么多kafka调优的文章,在producer和consumer端做了一些配置修改
但是 kafka 仍然需要 1.10 秒才能将一条消息从生产者发送到消费者。根据 kafka,kafka 针对高延迟进行了很好的编程,但我无法实现。
生产者配置:
@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;
}
我想描述的几点:
- 生产者:为了低延迟,Batch.size和liner.ms对生产者配置非常重要。尝试设置为最大值。
- 消费者:为了高吞吐量,需要增加缓冲区大小。
我进行了这两个更改,但仍然无法实现我对 Kafka 的期望。
- 如何使用kafka实现高延迟? producer 和 consumer 有什么具体的配置吗?
任何建议都会对我有所帮助。
Confluent 在 Optimizing your Kafka Deployment 上有一篇很好的白皮书,其中详细解释了如何为
优化配置- 延迟
- 吞吐量
- 耐用性
- 可用性
您有兴趣减少延迟。您当前的配置可能会导致高延迟,因为 linger.ms
设置为 1000(1 秒)。此外,batch.size
“相当高”,可能导致至少 1 秒的延迟(来自 linger.ms)。
为了减少延迟,您可以通过设置 linger.ms=0
.
总的来说,白皮书给出了以下建议,也是我在实践中亲身体验过的,非常支持:
制作人:
linger.ms=0
compression.type=none
acks=1
消费者:
fetch.min.bytes=1