Java spring kafka中未应用的最小提取字节数属性
这是我的消费者配置:Java spring kafka中未应用的最小提取字节数属性,java,spring,spring-boot,apache-kafka,spring-kafka,Java,Spring,Spring Boot,Apache Kafka,Spring Kafka,这是我的消费者配置: @Configuration @EnableKafka public class KafkaConfiguration { @Value("${kafka.bootstrap-servers}") private String bootstrapServers; @Bean public Map<String, Object> consumerConfigs(){ Map<String, Object&g
@Configuration
@EnableKafka
public class KafkaConfiguration {
@Value("${kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public Map<String, Object> consumerConfigs(){
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "......MyEventDeserializer");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "id");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, "100000");
props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "2000");
return props;
}
@Bean
public ConsumerFactory<String, List<MyEvent>> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, List<MyEvent>>> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, List<MyEvent>> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
@Bean
public ProducerFactory<String, List<MyEvent>> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
}
它不会影响发送给消费者的每条消息中的有效负载大小。当我记录进入反序列化程序的byteArray的大小时,它是常量(大约20kB—生产者发送的一条消息的大小),并且即使应用fetch.min.bytes属性,也不会改变。有没有什么我遗漏的,我应该补充一下,让它发挥作用?我想你有一个基本的误解。你所说的“…为了让它发挥作用”是什么意思 这些属性对单个消息没有影响 如果您的消息正好有20000字节,这些设置意味着
poll()
将等待5条消息或2秒,以先到者为准
如果你是这么想的话,它不是一种过滤掉小于10k的消息的机制
使用Spring for Apache Kafka,您可以使用FilteringMessageListenerAdapter
筛选出您不感兴趣的消息
如果您使用的是
@KafkaListener
,请向容器工厂添加RecordFilterStrategy
,适配器将自动应用。我认为您有一个基本的误解。你所说的“…为了让它发挥作用”是什么意思
这些属性对单个消息没有影响
如果您的消息正好有20000字节,这些设置意味着poll()
将等待5条消息或2秒,以先到者为准
如果你是这么想的话,它不是一种过滤掉小于10k的消息的机制
使用Spring for Apache Kafka,您可以使用FilteringMessageListenerAdapter
筛选出您不感兴趣的消息
如果您使用的是
@KafkaListener
,请向容器工厂添加RecordFilterStrategy
,适配器将自动应用。如果您的消息正好是20000字节,这些设置意味着轮询()将等待5条消息或2秒,以先到者为准。
事实上,这不会发生。生产者在短时间内发送了许多消息,但消费者并没有将消息聚合到至少100000字节的组中,它仍然一个接一个地获取每条消息(是的,我确信接收100000字节所需的时间不到2秒)但是你说进入反序列化程序的字节数组是常量。当然,它们仍然是必须一次反序列化的离散记录。该级别没有聚合。这只是每次轮询时要获取的字节数,但每条消息仍然是独立的。这些属性只会影响提取的记录数。如果您的消息正好是20000字节,这些设置意味着poll()将等待5条消息或2秒,以先到者为准。
当然不会发生这种情况。生产者在短时间内发送了许多消息,但消费者并没有将消息聚合到至少100000字节的组中,它仍然一个接一个地获取每条消息(是的,我确信接收100000字节所需的时间不到2秒)但是你说进入反序列化程序的字节数组是常量。当然,它们仍然是必须一次反序列化的离散记录。该级别没有聚合。这只是每次轮询时要获取的字节数,但每条消息仍然是独立的。这些属性只会影响获取的记录数量。
21:50:53.412 [main] INFO o.a.k.c.c.ConsumerConfig () - ConsumerConfig values:
auto.commit.interval.ms = 5000
auto.offset.reset = latest
bootstrap.servers = [localhost:9092]
check.crcs = true
client.id =
connections.max.idle.ms = 540000
enable.auto.commit = true
exclude.internal.topics = true
fetch.max.bytes = 52428800
fetch.max.wait.ms = 2000
fetch.min.bytes = 100000
group.id = id
heartbeat.interval.ms = 3000
interceptor.classes = null
internal.leave.group.on.close = true
isolation.level = read_uncommitted
key.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
max.partition.fetch.bytes = 1048576
max.poll.interval.ms = 300000
max.poll.records = 500
metadata.max.age.ms = 300000
...