假设我在单个Kafka分区中有一个topic(test),并且每个消费者组中都有一个消费者的2个消费者组(group_id1,group_id2)正在消费该主题。
我想在分配分区时为另一个消费者组重置偏移量,但是这里的问题是我正在为另一个消费者组重置偏移量。下面的代码将有助于了解情况。
线程1
Consumer<Long, String> consumer = new KafkaConsumer<>("group_id1");
consumer.subscribe(
test,
new ConsumerRebalanceListener({
@Override
public void onPartitionsRevoked(Collection<TopicPartition> partitions) {
.....
}
@Override
public void onPartitionsAssigned(Collection<TopicPartition> topicPartitions) {
Consumer<Long, String> consumer = new KafkaConsumer<>("group_id2");
consumer.assign(topicPartitions)
for(TopicPartition topicPartition : topicPartitions) {
consumer.commitSync(newOffset) -> failing because of [REASON]
}
}
});
consumer.pool()
....
线程2
Consumer<Long, String> consumer = new KafkaConsumer<>("group_id2");
consumer.subscribe(
test,
new ConsumerRebalanceListener({
@Override
public void onPartitionsRevoked(Collection<TopicPartition> partitions) {
.....
}
@Override
public void onPartitionsAssigned(Collection<TopicPartition> topicPartitions) {
// Wait for the new adjusted offset
}
});
consumer.pool()
....
[原因]
所以我上面的代码所面临的问题是我无法为获取CommitFailedException的使用者组“ group_id2”提交新的偏移量。相同的消费者组“ group_id2”。这是众所周知的原因,因为Kafka不允许通过主题订阅将手动分区分配与动态分区分配混合使用
我不能使用查找而不是提交,因为查找只是在Thread1中为使用者使用重置偏移量,但是我想在Thread2中使用重置偏移量。
还有其他方法可以实现我想做的事情吗?另外,是否每个线程都可以在不同的计算机上运行,所以threadt1在machine1中运行,而thread2在machine2中运行,我在这里使用线程使事情更容易解释。我不能使用parallelHashMap这样的东西来管理偏移量,因为有可能让此线程在不同的机器上运行。