考虑以下代码 -
@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map<String, Object> props = new HashMap<>();
props.put(
ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
bootstrapAddress);
props.put(
ConsumerConfig.GROUP_ID_CONFIG,
groupId);
props.put(
ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
props.put(
ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(props);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String>
kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory
= new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
我创建了一个消费者工厂和concurrentKafkaListenercontainer Factory。我没有为监听器Factory设置并发性。 我有一个用@KafkaListener
注释的方法@KafkaListener(topics = "topicName")
public void listen(String message) {
System.out.println("Received Message: " + message);
当我不设置并发属性时,Spring会创建1个消费者实例,1个kafka侦听器容器属于消费者工厂中指定的组吗?
如果我将并发性更改为3,那么Spring会创建3个消费者实例,因此在配置消费者工厂和3个侦听器容器时,同一个消费者组中有3个消费者吗?
此外,根据并发性,我们假设我们现在只收听一个主题,我们将有3个用@kafkalistener注释的方法,如果没有指定分区,则所有3个方法都会监听不同的分区(由kafka以循环方式提供) )。 ?
我是卡夫卡的新手,想澄清我的理解。
答案 0 :(得分:5)
当我不设置并发属性时,Spring会创建1个消费者实例,1个kafka侦听器容器属于消费者工厂中指定的组吗?
您将有一个消费者从该主题的所有分区中获取事件。
如果我将并发性更改为3,那么Spring会创建3个消费者实例,因此在配置消费者工厂和3个侦听器容器时,同一个消费者组中有3个消费者吗?
您将拥有3个消费者实例,如果该主题中至少有3个分区,则每个分区都将从其中一个分区中获取事件。消费者将事件传递给该KafkaListener实例。
你可以更具体。
x
1: 1
2: 2
3: 3
4: NA
5: 5
此外,根据并发性,我们假设我们现在只收听一个主题,我们将有3个用@kafkalistener注释的方法,如果没有指定分区,则所有3个方法都会监听不同的分区(由kafka提供)循环方式)。 ?
这没有任何意义。首先,KafkaListeners是Spring Kafka的高级抽象,Kafka根本没有循环(从消费者的角度来看,它与制作人不同),如果你有3个消费者(同样的话)消费者组+在同一主题上进行侦听,并且主题中有3个分区,Kafka将重新平衡并将一个分区分配给一个消费者,每个消费者将仅从其由Kafka分配的分区中获取事件。 Spring Kafka在收到每个消费者的事件后,将在KafkaListener实例中提供事件。