Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring boot kafka上添加分区需要一些时间才能生效_Java_Spring Boot_Spring Kafka - Fatal编程技术网

Java 在Spring boot kafka上添加分区需要一些时间才能生效

Java 在Spring boot kafka上添加分区需要一些时间才能生效,java,spring-boot,spring-kafka,Java,Spring Boot,Spring Kafka,我正在修改Kafka主题,为其添加分区(从3个分区增加到4个分区)。 在consumer上,我已经有4个并发,使用@KafkaListener @KafkaListener(topics = "t_multi_partitions", concurrency = "4") 制作人每隔几秒钟发送一次消息,但通常每个消息的发送时间不超过5秒 有趣的是,当我改变分区时 kafka-topics.sh--引导服务器localhost:9092--alter--主题t\u多分区--分区4 它不会直接生效

我正在修改Kafka主题,为其添加分区(从3个分区增加到4个分区)。 在consumer上,我已经有4个并发,使用
@KafkaListener

@KafkaListener(topics = "t_multi_partitions", concurrency = "4")
制作人每隔几秒钟发送一次消息,但通常每个消息的发送时间不超过5秒

有趣的是,当我改变分区时

kafka-topics.sh--引导服务器localhost:9092--alter--主题t\u多分区--分区4

它不会直接生效。
生产者开始向第四个分区发送消息大约需要5分钟,重新平衡第四个消费者也需要5分钟才能生效

这正常吗?我使用的是SpringBoot2.1 我如何调整这5分钟的时间(更长或更短)

消费者代码(简化)

@KafkaListener(topics=“t\u多分区”,concurrency=“4”)
public void listen(消费者记录消息)引发InterruptedException{
log.info(“Key:{},Partition:{},Message:{}”,Message.Key(),Message.Partition(),Message.value());
}

这是由Apache Kafka控制的,而不是由Spring Kafka控制的。这种行为是正常的

您可以通过调整元数据.max.age.ms来修改刷新率。这是生产者和消费者配置。生产者和消费者配置不需要具有相同的配置值

引用阿帕奇·卡夫卡的话

强制刷新的时间段(毫秒) 元数据,即使我们没有看到任何分区领导权的变化 主动发现任何新的代理或分区

示例中的Spring Kafka运行四个
@KafkaListener
线程。主题和分区根据
partition.assignment.strategy
定义的分配者策略委派给每个
@KafkaListener
<代码>范围赋值器是默认策略。这是一个消费者配置

引用ApacheKafka文档

客户端使用的分区分配策略的类名 将用于在使用者实例之间分配分区所有权 使用组管理时


基于@kkflf指南,生产商配置

@配置
公共级卡夫卡康菲{
@自动连线
私人卡夫卡财产卡夫卡财产;
@豆子
公共卡夫卡模板卡夫卡模板(){
返回新的卡夫卡模板(producerFactory());
}
@豆子
公共地图产品配置(){
var props=kafkaProperties.buildProducerProperties();
props.put(ProducerConfig.METADATA\u MAX\u AGE\u CONFIG,“600000”);
返回道具;
}
@豆子
公共生产工厂生产工厂(){
返回新的DefaultKafkaProducerFactory(producerConfigs());
}
}
@KafkaListener(topics = "t_multi_partitions", concurrency = "4")
public void listen(ConsumerRecord<String, String> message) throws InterruptedException {
    log.info("Key : {}, Partition : {}, Message : {}", message.key(), message.partition(), message.value());
}