繁体   English   中英

spring-kafka如何配置kafka消费者投票的频率

[英]How to configure frequency for kafka consumer poll in spring-kafka

我正在尝试在 Spring Boot 项目中使用 spring-kafka 从我的 kafka 读取消息。 我正在使用 @KafkaListener 但问题是我的消费者总是在运行。 一旦我从控制台生成一条消息,它就会在我的应用程序中弹出。 我想定期进行轮询。 我怎样才能做到这一点?

@Service
public class KafkaReciever {

private static final Logger LOGGER =
        LoggerFactory.getLogger(KafkaReciever.class);

private CountDownLatch latch = new CountDownLatch(1);

public CountDownLatch getLatch() {
    return latch;
}

@KafkaListener(topics = "test")
public void receive(String payload) {
    LOGGER.info("received payload='{}'", payload);
    latch.countDown();
}

}

这是我的消费者配置:

@Bean
public Map<String, Object> consumerConfigs() {
    Map<String, Object> props = new HashMap<>();

    // list of host:port pairs used for establishing the initial connections to the Kafka cluster
    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);

    // allows a pool of processes to divide the work of consuming and processing records
    props.put(ConsumerConfig.GROUP_ID_CONFIG, "foo1");

    // automatically reset the offset to the earliest offset
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

    return props;
}

@Bean
public ConsumerFactory<String, String> consumerFactory() {
    return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}

@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, String> factory =
            new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());

    return factory;
}

这就是它的设计方式。 它是一个消息驱动的容器(与其他Spring消息传递技术抽象-RabbitMQ,JMS等保持一致)。

要仅按需获取消息,您有两种选择:

  • 使用消费者工厂创建消费者,订阅(或分配)主题/分区并调用poll()
  • 使用spring-integration-kafkaKafkaMessageSource并调用receive()

在这两种情况下,如果您都使用kafka组管理,则需要注意max.poll.interval.ms以避免重新平衡。

您可以使用spring集成入站通道适配器来定期轮询消息源。

从 2.3 版本开始,添加了一个名为idleBetweenPolls的新属性。

从版本 2.3 开始,ContainerProperties 提供了一个 idleBetweenPolls 选项,让侦听器容器中的主循环在 KafkaConsumer.poll() 调用之间休眠。 从提供的选项和 max.poll.interval.ms 消费者配置与当前记录批处理时间之间的差异中选择实际睡眠间隔作为最小值。

这样您就可以在消费者轮询之间添加间隔。

来源: https : //docs.spring.io/spring-kafka/reference/html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM