今日 kafka を使用しているときに、 auto.offset.reset をearly、latest、または 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 は最新のデータを消費するだけではありません。消費グループが変更されない限り、消費は最後の消費からのみ継続されます。終了しました。