文章目录
1、消费者食用DEMO
Properties prop = new Properties();
prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka:9092");
prop.put(ConsumerConfig.GROUP_ID_CONFIG, "testConsumer");
prop.put(ConsumerConfig.CLIENT_ID_CONFIG, "consumerDemo");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop);
consumer.subscribe(Collections.singleton("test"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> record : records) {
String key = record.key();
String value = record.value();
System.err.println(record.toString());
}
}
2、消费者基本概念
kafka
消费者是以 组为基本单位 进行消费的。消费的模型如下
1 个 topic
允许被多个 消费组
消费。再次强调,kafka
消费是以组为单位。
prop.put(ConsumerConfig.GROUP_ID_CONFIG, "testConsumer");
以上这行代码设置了消费组。
2.1、partition
分配
topic
为逻辑上的概念,partition
才是物理上的概念。那么看完这个以上的消费模型图。你可能会很疑惑。当一个组下有多个消费者时,每个消费者是如何消费的?
先说明:partition
的分配为平均分配
假设一:topic1
下面有 3 个分区。分别如下:p1 - p3。那么 groupA
下的三个消费者消费的对应 partition
为如下
instance1: p1
instance2: p2
instance3: p3
假设二:topic1
下面有 8 个分区。分别为 p1 - p8。那么 groupA
中每个消费者分配到的 partition
就如下
instance1: p1,p2,p3
instance2: p4,p5,p6
instance3: p7,p8
2.2、partition
重分配
假设三:topic1
下面有 8 个分区:P1 - P8。groupA
有三个消费者:c1,c2,c3。此时分配的 partition
如下
c1: p1,p2,p3
c2: p4,p5,p6
c3: p7,p8
如果此时,又有一个新的消费者加入到 groupA
会发生什么呢? partition
会被重新分配
c1: p1,p2
c2: p3,p4
c3: p5,p6
c4: p7,p8
3、消费者端 API
介绍
3.1、订阅主题
void subscribe(Collection<String> topics);
void subscribe(Collection<String> topics, ConsumerRebalanceListener callback)