web-dev-qa-db-ja.com

Kafkaの消費者オフセットを左右する要因は何ですか?

私はKafkaが比較的初めてです。私はそれを少し試してみましたが、消費者オフセットに関して私にはいくつかのことがはっきりしません。私がこれまでに理解してきたことから、コンシューマが起動するとき、それが読み始めるオフセットは設定設定auto.offset.resetによって決定されます(私が間違っていたら私を修正してください)。

たとえば、トピックに10個のメッセージ(オフセット0から9)があり、消費者がそれが落ちる前(または消費者を殺す前)にそのうちの5個を消費したとします。それから私はその消費者プロセスを再起動すると言う。私の質問は:

  1. auto.offset.resetsmallestに設定されている場合、常にオフセット0から消費されますか?

  2. auto.offset.resetlargestに設定されている場合、オフセット5から消費が始まりますか?

  3. この種のシナリオに関する振る舞いは常に決定的ですか?

私の質問に何か不明な点がある場合は、コメントしてください。前もって感謝します。

136
Asif Iqbal

あなたが説明したよりも少し複雑です。あなたのコンシューマグループがどこかにコミットされた有効なオフセットを持っていない場合のみ、auto.offset.reset設定が有効になります(現在サポートされている2つのオフセットストレージはKafkaとZookeeperです)。そしてそれはあなたがどんな種類の消費者を使うかにもよります。

高レベルのJavaコンシューマを使用している場合は、次のようなシナリオを想像してください。

  1. 5つのメッセージを消費して死亡した消費者グループgroup1の消費者がいます。次回このコンシューマを起動するときには、そのauto.offset.reset設定を使用することすらありません。オフセット記憶域から記憶されたオフセットを取得するだけなので、停止した場所から続行します(KafkaまたはZK)。

  2. あなたは(あなたが説明したように)トピックにメッセージを持っていて、新しい消費者グループgroup2で消費者を始めます。どこにもオフセットは格納されていないので、今度はauto.offset.reset設定がトピックの先頭(smallest)から開始するか、トピックの末尾(largest)から開始するかを決定します。

どのオフセット値がsmallestおよびlargest configに対応するかに影響を与えるもう1つのことは、ログ保存ポリシーです。保存期間を1時間に設定したトピックがあるとします。あなたは5つのメッセージを作り出し、そして1時間後にあなたはさらに5つのメッセージを投稿します。 largestのオフセットは前の例と同じままですが、Kafkaはすでにこれらのメッセージを削除しているため、smallestのオフセットを0にすることはできません。したがって、使用可能な最小オフセットは5になります。

上記のすべてはSimpleConsumerとは関係がなく、実行するたびにauto.offset.reset設定を使用することからどこから始めるかが決まります。

216
serejja

更新のみ:Kafka 0.9以降、Kafkaは新しいJavaバージョンのコンシューマを使用していて、auto.offset.resetパラメータ名が変更されました。マニュアルから:

Kafkaに初期オフセットがない場合、または現在のオフセットがサーバーに存在しなくなった場合(たとえば、そのデータが削除されたため)に行うべきこと:

最も早い:自動的にオフセットを最も早いオフセットにリセットします

latest:オフセットを自動的に最新のオフセットにリセットします

none:コンシューマのグループに対して以前のオフセットが見つからない場合、コンシューマに例外をスローします。

他に何でも:消費者に例外を投げなさい。

私は受け入れられた答えをチェックした後これを見つけるためにしばらく時間を費やした、それで私はそれがコミュニティにとってそれを掲示することが役に立つかもしれないと思った。

67
israel.zinc

さらにoffsets.retention.minutesがあります。最後のコミット以降の時間が> offsets.retention.minutesの場合、auto.offset.resetもキックインします。

7
Sasa Ninkovic