这是我的使用者配置:
@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属性,它也没有变化。我要在这里添加一些东西以使其正常工作吗?
答案 0 :(得分:0)
我认为您有一个基本的误解。您所说的“ ...使其有效”是什么意思?
这些属性对单个消息没有影响。
如果您的消息正好是20000字节,则这些设置意味着poll()
将等待5条消息或2秒,以先到者为准。
如果您正在考虑的话,这不是一种机制来“过滤”小于10k的消息。
使用Spring for Apache Kafka,您可以使用FilteringMessageListenerAdapter
过滤掉您不感兴趣的消息。
如果您使用的是@KafkaListener
,请向容器工厂添加RecordFilterStrategy
,适配器将自动应用。