Kafka通过分配和订阅来管理偏移量

时间:2018-08-23 16:54:52

标签: java apache-kafka kafka-consumer-api

假设我在单个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这样的东西来管理偏移量,因为有可能让此线程在不同的机器上运行。

0 个答案:

没有答案