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

时间:2020-11-10 10:30:35

标签: apache-kafka kafka-consumer-api kafka-producer-api

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

但卡夫卡仍然花了1.10秒才能从生产者到消费者传达一条信息。按照kafka的说法,kafka的编程能力很好,可以实现高延迟,但是我却无法实现。

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;
    }

ConsumerConfig

@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. 消费者:要获得高吞吐量,需要增加缓冲区大小。

我进行了这两个更改,但仍然无法实现卡夫卡的预期。

  1. 如何使用kafka实现高延迟?生产者和消费者中是否有任何特定的配置?

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

1 个答案:

答案 0 :(得分:2)

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