Kafka消费者-笔记2
消费者,消费组
一个消费组只有一个消费者能消费消息
消费者Consumer负责订阅kafka中的主题Topic,并且从订阅的主题上拉取消息。
每个消费者有一个对应的消费组Consumer Group,当消息发布到主题后,只会被订阅它的每个消费组中的一个消费者
可通过消费者客户端参数partition.assignment.strategy
来设置消费者与订阅主题之间的分区分配策略
kafka支持两种消息投递模式:点对点P2P(所有消费者属于一个消费组),发布/订阅Pub/Sub模式(所有消费者属于不同的消费组)
消费者客户端参数group.id配置消费组
消费者客户端
正常的消费逻辑:
- 配置消费者客户端参数并创建消费者实例
- 订阅主题
- 拉取消息消费
- 提交消费位移
- 关闭消费者实例
demo
public static final String brokerList = "localhost:9092";
public static final String topic = "topic-demo";
public static final String groupId = "group.demo";
public static final AtomicBoolean isRunning = new AtomicBoolean(true);
public static Properties initConfig() {
Properties props = new Properties();
props.put("key.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
props.put("bootstrap.servers", brokerList);
props.put("group.id", groupId);
props.put("client.id", "consumer.client.id.demo");
return props;
}
public static void main(String[] args) {
Properties props = initConfig();
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList(topic));
try {
while (isRunning.get()) {
ConsumerRecords<String, String> records =
consumer.poll(Duration.ofMinutes(2));
// 客户端拉取消息并消费所有消息
for (ConsumerRecord<String, String> record : records) {
System.out.println("topic = " + record.topic()
+ ", partition = " + record.partition()
+ ", offset = " + record.offset());
System.out.println("key = " + record.key()
+ ", value = " + record.value());
//do something to process record.
System.out.println(record.headers());
}
}
} catch (Exception e) {
log.error("occur exception ", e);
} finally {
consumer.close();
}
}
需要初始化配置于KafkaConsumer(subscribe方法订阅主题)(poll方法拉取消息列表)
参数配置
必要参数:
bootstrap.servers:连接kafka集群地址
group.id:消费者所属消费组的id
key.deserializer和value.deserializer:与生产者客户端相对应的反序列器
client.id:设定KafkaConsumer对应的客户端id,不设置 自动生成形如consumer-1
更多参数查看类ConsumerConfig
订阅主题和分区
消费者可以订阅一个或多个主题,使用subscribe方法订阅主题,订阅方式有数组和正则
主题
subscribe订阅主题:
// 集合方式订阅主题
public void subscribe(Collection<String> topics, ConsumerRebalanceListener listener)
public void subscribe(Collection<String> topics)
// 正则方式订阅主题
public void subscribe(Pattern pattern, ConsumerRebalanceListener listener)
public void subscribe(Pattern pattern)
注意:subscribe执行多次以最后一次执行结果为准
ConsumerRebalanceListener用来设置相应的再均衡监听器
正则subscribe订阅主题实例:
订阅形如topic-1这样的主题 贪婪匹配
consumer.subscribe(Pattern.compile(