1. ホーム

[解決済み】Kafkaコンシューマオフセットを決定するのは何ですか?

2022-04-05 03:48:26

質問

私はKafkaの比較的新しいユーザーです。少し実験してみましたが、コンシューマオフセットについていくつか不明な点があります。私がこれまでに理解したところでは、コンシューマが起動するとき、それが読み取りを開始するオフセットは、構成設定によって決定されます。 auto.offset.reset (間違っていたら訂正してください)。

例えば、トピックに10個のメッセージ(オフセット0から9まで)があり、あるコンシューマがダウンする前に(あるいは私がコンシューマを殺す前に)たまたまそのうちの5個を消費していたとします。そして、そのコンシューマー・プロセスを再起動させたとします。私の質問は、以下の通りです。

  1. もし auto.offset.reset が設定されています。 earliest は、常にオフセット0から消費を開始するのでしょうか?

  2. もし auto.offset.reset が設定されています。 latest の場合、オフセット5から消費し始めるのでしょうか?

  3. この種のシナリオに関する動作は、常に決定論的なのでしょうか?

私の質問で不明な点があれば、遠慮なくコメントしてください。

どのように解決するのですか?

もう少し複雑です。

auto.offset.reset コンフィグ は、コンシューマグループが有効なオフセットをどこかにコミットしていない場合にのみ起動します (現在サポートされているオフセットストレージは Kafka と Zookeeper の 2 つです)。

もしあなたが高レベルのJavaコンシューマを使用している場合、以下のシナリオを想像してみてください。

  1. コンシューマグループ内にコンシューマがある場合 group1 このメッセージは5つのメッセージを消費して死にました。次にこのコンシューマを起動するときは、その auto.offset.reset オフセットストレージ(KafkaまたはZK)から保存されたオフセットを取得するだけなので、死亡した場所から続行します。

  2. トピックにメッセージがあり(説明の通り)、新しいコンシューマーグループでコンシューマーを開始するとします。 group2 . どこにもオフセットが保存されておらず、今回は auto.offset.reset は、トピックの先頭から始めるかどうかを決定します ( earliest ) またはトピックの最後から ( latest )

もう一つ、オフセット値がどのように対応するかに影響するものがあります。 earliestlatest は、ログの保持ポリシーです。例えば、トピックの保存期間を1時間に設定したとします。5つのメッセージを作成し、その1時間後にさらに5つのメッセージを投稿したとします。このとき latest オフセットは前の例と同じままですが earliest にすることはできません。 0 なぜなら、カフカはこれらのメッセージをすでに削除しているため、最も早く利用可能なオフセットは 5 .

上記はすべて SimpleConsumer で、実行するたびに、どこから始めるかを auto.offset.reset コンフィグ

Kafkaのバージョンが0.9より古い場合、以下のように置き換える必要があります。 earliest , latestsmallest , largest .