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をスローしないのはなぜですか?
こんにちはこのためには、コード内のリバランス条件を処理する必要があり、リバランスの前に進行中のメッセージを処理してコミットする必要があります
のような:
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())
これを行う利点:
リバランスが行われているとき、メッセージは繰り返されません。
コミット失敗例外は例外を導きません
session.timeout.ms
コンシューマーに設定する値は、group.max.session.timeout.ms
set on Kafkaブローカー。
これで問題は解決しました。
Githubリンクのクレジット Commit Failures