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
    ...