web-dev-qa-db-ja.com

CommitFailedExceptionグループはすでにバランスを取り直し、パーティションを別のメンバーに割り当てているため、コミットを完了できません

kafka 0.10.2を使用していましたが、CommitFailedExceptionに直面しました。

グループはすでにバランスを取り直し、パーティションを別のメンバーに割り当てているため、コミットを完了できません。これは、後続のpoll()の呼び出し間の時間が設定されたmax.poll.interval.msよりも長いことを意味します。これは通常、ポーリングループがメッセージ処理に時間を費やしていることを意味します。セッションタイムアウトを増やすか、max.poll.recordsでpoll()に返されるバッチの最大サイズを減らすことで、これに対処できます。

Max.poll.interval.msをInteger.MAX_VALUEに設定しました。だから、私が値を設定しても、なぜこれがまだ起こるのか誰にも教えてもらえますか?

別の質問は次のとおりです。session.timeout.msを60000に設定するために説明するのですが、それでも起こります。簡単なコードで再現してみます

 public static void main(String[] args) throws InterruptedException {     
        Logger logger = Logger.getLogger(KafkaConsumer10.class);
        logger.info("XX");
        Properties props = new Properties();
        props.put("bootstrap.servers", "kafka-broker:9098");
        props.put("group.id", "test");
        props.put("enable.auto.commit", "true");
        props.put("auto.commit.interval.ms", "1000");
        props.put("key.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer");
        props.put("max.poll.interval.ms", "300000");
        props.put("session.timeout.ms", "10000");
        props.put("max.poll.records", "2");
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Arrays.asList("t1"));
        while (true) {
            Thread.sleep(11000);
            ConsumerRecords<String, String> records = consumer.poll(100);
            //Thread.sleep(11000);
            Thread.sleep(11000);
            for (ConsumerRecord<String, String> record : records)
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
        }

session.timeout.msを10000に設定すると、ポーリングループで10000ミリ秒を超えてスリープしようとしますが、動作しているようで、例外は発生していません。だから私はこれについて混乱しています。 consumer.pollとconsumer.commitによってハートビートがトリガーされる場合、私のコードではハートビートがセッションタイムアウトから外れているようです。 CommitFailedExceptionをスローしないのはなぜですか?

17
Simon Su

こんにちはこのためには、コード内のリバランス条件を処理する必要があり、リバランスの前に進行中のメッセージを処理してコミットする必要があります

のような:

private class HandleRebalance implements ConsumerRebalanceListener {
        public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
            // Implement what you want to do once rebalancing is done.
        }

        public void onPartitionsRevoked(Collection<TopicPartition> partitions) {

           // commit current method

       }
    }

トピックをサブスクライブするには、次の構文を使用します。

kafkaConsumer.subscribe(topicNameList、new HandleRebalance())

これを行う利点:

  1. リバランスが行われているとき、メッセージは繰り返されません。

  2. コミット失敗例外は例外を導きません

5
Abhimanyu

session.timeout.msコンシューマーに設定する値は、group.max.session.timeout.ms set on Kafkaブローカー。

これで問題は解決しました。

Githubリンクのクレジット Commit Failures

3
Rahul Teke