一. KafkaConsumer订阅topic数据的方式可以分为两种
1. 通过subscribe方法订阅,api接口如下:
1.1 public void subscribe(Collection topics);
topics:想订阅相关topic集合
1.2 public void subscribe(Collection topics, ConsumerRebalanceListener listener)
topics:想订阅相关topic集合
listener:当相同group.id下有多个consumer时,会触发topic partition的重新分配,此参数就是重新分配时的回调监听器
举个例子:
例如test topic有两个partition,partition-0和partition-1
当group.id为test_group的consumer消费test topic的数据时,当只有一个consumer时,这个consumer负责消费partition-0和partition-1的数据。
如果此时再有一个group.id为test_group的consumer订阅test topic的数据时,就会触发consumer组的再平衡处理,每一个consumer分别负责消费一个partition的数据。
再平衡重新分配是如何实现的,这个比较复杂,会在后续的文章中通过源码,详细介绍
1.3 public void subscribe(Pattern pattern, ConsumerRebalanceListener listener)
pattern:想订阅相关topic的正则表达式
listener:当相同group.id下有多个consumer时,会触发topic partition的重新分配,此参数就是重新分配时的回调监听器
2. 通过assign方法订阅,api接口如下:
2.1 public void assign(Collection partitions)
partitions:想订阅相关topic的TopicPartition集合
此方法相当于是人为的控制我们想要订阅哪些topic的哪些partition
举个例子:
例如test topic有两个partition,partition-0和partition-1,可以通过下面的方式订阅
TopicPartition tp0 =new TopicPartition("test", 0);
TopicPartition tp1 =new TopicPartition("test", 1);
consumer.assign(Arrays.asList(tp0, tp1));
二 总结
通过上面对KafkaConsumer相关api的详细说明,我们可以得知,这两种方式的区别如下:
当相同group.id下有多个消费者时,subscribe相关api方法会自动触发消费者消费哪些topic partition的再平衡,
相反以assign相关api订阅则不会触发再平衡。