如何减少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;
    }

我想描述的几点:

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

我进行了这两个更改,但仍然无法实现我对 Kafka 的期望。

  1. 如何使用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