在spring-kafka中未应用的提取字节数属性最少

时间:2019-04-28 20:15:54

标签: 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> 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());
    }
}

重要的是,我正在设置fetch.min.bytes和fetch.max.wait.ms配置,尽管我可以看到这些属性在启动时已登录:

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

它不会影响发给使用者的每条消息中的有效负载大小。当我记录进入解串器的byteArray的大小时,它的大小是恒定的(大约20kB-生产者发送的一条消息的数量),尽管应用了fetch.min.bytes属性,它也没有变化。我要在这里添加一些东西以使其正常工作吗?

1 个答案:

答案 0 :(得分:0)

我认为您有一个基本的误解。您所说的“ ...使其有效”是什么意思?

这些属性对单个消息没有影响。

如果您的消息正好是20000字节,则这些设置意味着poll()将等待5条消息或2秒,以先到者为准。

如果您正在考虑的话,这不是一种机制来“过滤”小于10k的消息。

使用Spring for Apache Kafka,您可以使用FilteringMessageListenerAdapter过滤掉您不感兴趣的消息。

如果您使用的是@KafkaListener,请向容器工厂添加RecordFilterStrategy,适配器将自动应用。