seekToEnd所有分区,并在卡夫卡消费者的自动重新平衡中生存

时间:2017-07-13 08:18:19

标签: java apache-kafka kotlin

当消费者组A的Kafka消费者连接到Kafka经纪人时,我想寻求到所有分区的末尾,即使在代理端存储了偏移量。如果更多其他消费者连接到同一个消费者群体,他们应该获取最新存储的偏移量。 我正在做以下事情:

consumer.poll(timeout) 
consumer.seekToEnd(emptyList())

while(true) {
  val records = consumer.poll(timeout)
  if(records.isNotEmpty()) {
    //print records
    consumer.commitSync()
  }
}

问题是,当我连接消费者组A的第一个消费者c1时,一切都按预期工作,如果我连接消费者组A的另一个消费者c2,则该组正在重新平衡,而c1将消耗跳过的偏移。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以创建一个实现ConsumerRebalanceListener的类,如下所示:

public class AlwaysSeekToEndListener<K, V> implements ConsumerRebalanceListener {

    private Consumer<K, V> consumer;

    public AlwaysSeekToEndListener(Consumer consumer) {
        this.consumer = consumer;
    }

    @Override
    public void onPartitionsRevoked(Collection<TopicPartition> partitions) {

    }

    @Override
    public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
        consumer.seekToEnd(partitions);
    }
}

然后在订阅主题时使用此侦听器:

consumer.subscribe(Collections.singletonList("test"), new AlwaysSeekToEndListener<String, String>(consumer));