私はKafkaが比較的初めてです。私はそれを少し試してみましたが、消費者オフセットに関して私にはいくつかのことがはっきりしません。私がこれまでに理解してきたことから、コンシューマが起動するとき、それが読み始めるオフセットは設定設定auto.offset.reset
によって決定されます(私が間違っていたら私を修正してください)。
たとえば、トピックに10個のメッセージ(オフセット0から9)があり、消費者がそれが落ちる前(または消費者を殺す前)にそのうちの5個を消費したとします。それから私はその消費者プロセスを再起動すると言う。私の質問は:
auto.offset.reset
がsmallest
に設定されている場合、常にオフセット0から消費されますか?
auto.offset.reset
がlargest
に設定されている場合、オフセット5から消費が始まりますか?
この種のシナリオに関する振る舞いは常に決定的ですか?
私の質問に何か不明な点がある場合は、コメントしてください。前もって感謝します。
あなたが説明したよりも少し複雑です。あなたのコンシューマグループがどこかにコミットされた有効なオフセットを持っていない場合のみ、auto.offset.reset
設定が有効になります(現在サポートされている2つのオフセットストレージはKafkaとZookeeperです)。そしてそれはあなたがどんな種類の消費者を使うかにもよります。
高レベルのJavaコンシューマを使用している場合は、次のようなシナリオを想像してください。
5つのメッセージを消費して死亡した消費者グループgroup1
の消費者がいます。次回このコンシューマを起動するときには、そのauto.offset.reset
設定を使用することすらありません。オフセット記憶域から記憶されたオフセットを取得するだけなので、停止した場所から続行します(KafkaまたはZK)。
あなたは(あなたが説明したように)トピックにメッセージを持っていて、新しい消費者グループgroup2
で消費者を始めます。どこにもオフセットは格納されていないので、今度はauto.offset.reset
設定がトピックの先頭(smallest
)から開始するか、トピックの末尾(largest
)から開始するかを決定します。
どのオフセット値がsmallest
およびlargest
configに対応するかに影響を与えるもう1つのことは、ログ保存ポリシーです。保存期間を1時間に設定したトピックがあるとします。あなたは5つのメッセージを作り出し、そして1時間後にあなたはさらに5つのメッセージを投稿します。 largest
のオフセットは前の例と同じままですが、Kafkaはすでにこれらのメッセージを削除しているため、smallest
のオフセットを0
にすることはできません。したがって、使用可能な最小オフセットは5
になります。
上記のすべてはSimpleConsumer
とは関係がなく、実行するたびにauto.offset.reset
設定を使用することからどこから始めるかが決まります。
更新のみ:Kafka 0.9以降、Kafkaは新しいJavaバージョンのコンシューマを使用していて、auto.offset.resetパラメータ名が変更されました。マニュアルから:
Kafkaに初期オフセットがない場合、または現在のオフセットがサーバーに存在しなくなった場合(たとえば、そのデータが削除されたため)に行うべきこと:
最も早い:自動的にオフセットを最も早いオフセットにリセットします
latest:オフセットを自動的に最新のオフセットにリセットします
none:コンシューマのグループに対して以前のオフセットが見つからない場合、コンシューマに例外をスローします。
他に何でも:消費者に例外を投げなさい。
私は受け入れられた答えをチェックした後これを見つけるためにしばらく時間を費やした、それで私はそれがコミュニティにとってそれを掲示することが役に立つかもしれないと思った。
さらにoffsets.retention.minutesがあります。最後のコミット以降の時間が> offsets.retention.minutes
の場合、auto.offset.reset
もキックインします。