目录
1、需求分析
消费者从一个主题所有分区或者固定分区读取数据,此时就不需要消费者群组和分区在均衡了,
只需要把主题或者分区分配给消费者
,然后开始读取消息并提交偏移量。
此时消费者不需要订阅主题
,
取而代之的是为自己分配分区。
好处:
独立消费者自己分配分区,很好的自我控制
坏处:
没有再均衡等动态支持,需要自己新增分区
2、代码示例
public class IndependConsumer {
private static KafkaConsumer<String,String> consumer = null;
public static final String SINGLE_CONSUMER_TOPIC = "single-consumer";
public static void main(String[] args) {
Properties properties = new Properties();
properties.put("bootstrap.servers","127.0.0.1:9092");
properties.put("key.deserializer", StringDeserializer.class);
properties.put("value.deserializer", StringDeserializer.class);
/*独立消息消费者*/
consumer= new KafkaConsumer<>(properties);
List<TopicPartition> topicPartitionList = new ArrayList<TopicPartition>();
//获取主题的所有分区
List<PartitionInfo> partitionInfos = consumer.partitionsFor(SINGLE_CONSUMER_TOPIC);
if(null!=partitionInfos){
for(PartitionInfo partitionInfo:partitionInfos){
//将需要的分区放到list中
topicPartitionList.add(new TopicPartition(partitionInfo.topic(), partitionInfo.partition()));
}
}
//标记需要关注的分区
consumer.assign(topicPartitionList);
try {
while(true){
ConsumerRecords<String, String> records = consumer.poll(1000);
for(ConsumerRecord<String, String> record:records){
System.out.println(String.format(
"主题:%s,分区:%d,偏移量:%d,key:%s,value:%s",
record.topic(),record.partition(),record.offset(),
record.key(),record.value()));
//业务逻辑
}
}
} finally {
consumer.close();
}
}
}