Kafka の auto.offset.reset 値の分析

今日 kafka を使用しているときに、 auto.offset.reset をearlylatest、または noneに設定すると、期待した効果が得られないことがわかりました。

  • 最も早い: 各パーティションの下に送信されたオフセットがある場合、送信されたオフセットから消費が開始され、送信されたオフセットがない場合、最初から消費されます。
  • 最新: 各パーティションの下に送信されたオフセットがある場合は、送信されたオフセットから消費が開始され、送信されたオフセットがない場合は、パーティションの下に新しく生成されたデータが消費されます。
  • none: トピックの各パーティションに送信されたオフセットがある場合、そのオフセットから消費が開始されます。送信されたオフセットを持たないパーティションが存在する限り、例外がスローされます。

シミュレーション 1:

方法: このラウンドで構成されたトピックのオフセット値が送信され、自動的に送信されたオフセット値が false に設定され、オフセット値は手動で送信されません。同時に、プロデューサーは新しいデータを生成します。

    @Bean
    public KafkaConsumer<String, String> kafkaConsumer() {
        Map<String, Object> config = new HashMap<>();
        config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        config.put(ConsumerConfig.GROUP_ID_CONFIG, "testGroup");
        config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        // config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
        // config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "none");
        config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(config);
        return consumer;
    }

最も早い: 新しく生成されたデータをすべて読み取り、サービスが再起動されると消費が繰り返されます。

 最新:新しく生成されたデータをすべて読み取り、サービスが再起動されると消費が繰り返されます。

 none:新しく生成されたデータをすべて読み取り、サービスが再起動されると消費が繰り返されます。

結論: 各パーティションの下に送信されたオフセットがあり、3 つのパラメータはオフセットの後ろから消費されます。

シミュレーション 2:

kafka に蓄積されたすべてのデータ (デフォルトでは 48 時間) を消費する必要があります。

プロデューサーを構成するときに、新しい groupId を再構成します。新しい groupId にはオフセットが構成されておらず、プログラムが再起動されます。

    @Bean
    public KafkaConsumer<String, String> kafkaConsumer() {
        Map<String, Object> config = new HashMap<>();
        config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        config.put(ConsumerConfig.GROUP_ID_CONFIG, "testGroup-new");
        config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        // config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
        // config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "none");
        config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(config);
        return consumer;
    }

最も早い: すべての履歴データを読み取り、サービスが再起動されると消費が繰り返されます。

  最新:新しく生成されたデータをプロデューサーから読み取り、以前のデータは消費しません。

  none:サービスが再起動された後、プログラムはエラーを報告します。

 結論: 新しいグループを作成すると、最も古い パーティションが最初から使用されます。last は最新のデータを読み取り、none は コンシューマ グループの前のオフセット値が見つからない場合に例外をスローします。

概要:

1. 提出済みのオフセットがある場合は、最も早い、最も遅いの設定に関係なく、提出されたオフセットから消費が開始されます。提出されたオフセットがない場合、最も早いは最初から消費することを意味し、最新は最新のデータから消費することを意味します。 none トピックの各パーティションに送信されたオフセットがある場合、送信されたオフセットから消費が開始され、送信されたオフセットを持たないパーティションが存在する限り、例外がスローされます。

2. トピック内にグループ消費データがすでに存在します。他のグループ ID で新しいコンシューマを作成する場合、前のグループによって送信されたオフセットは、新しく作成されたグループ消費には影響しません。

3. group.id は変更せず、config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); を追加するだけです。コンシューマは最初から消費しません。コンシューマ グループが変更されない限り、消費するだけです。最後の消費の最後から消費を継続します。同様に、group.id が変更されない場合、latest は最新のデータを消費するだけではありません。消費グループが変更されない限り、消費は最後の消費からのみ継続されます。終了しました。

おすすめ

転載: blog.csdn.net/Romantic_lei/article/details/126597740