web-dev-qa-db-ja.com

kafkaコンシューマの自動コミットはどのように機能しますか?

私は読んでいます これ

自動コミットオフセットをコミットする最も簡単な方法は、コンシューマがオフセットをコミットできるようにすることです。 enable.auto.commit = trueを構成すると、5秒ごとに、コンシューマーはクライアントがpoll()から受け取った最大オフセットをコミットします。 5秒間隔がデフォルトであり、auto.commit.interval.msを設定することによって制御されます。コンシューマーの他のすべてと同様に、自動コミットはポーリングループによって駆動されます。ポーリングするたびに、コンシューマーはコミットするタイミングかどうかを確認し、コミットする場合は、前回のポーリングで返されたオフセットをコミットします。

たぶん私の英語が下手だという問題がありますが、私はこの説明を完全に理解していません。

デフォルトの間隔である5秒の自動コミットを使用し、ポーリングが7秒ごとに発生するとします。この場合、コミットは5秒ごとまたは7秒ごとに発生しますか?

ポーリングが3秒ごとに発生する場合の動作を明確にできますか?コミットは5秒ごとまたは6秒ごとに行われますか?
読みました これ

自動コミット:auto.commitをtrueに設定し、auto.commit.interval.msプロパティにミリ秒単位の値を設定できます。これを有効にすると、Kafkaコンシューマは、poll()呼び出しへの応答として受信された最後のメッセージのオフセットをコミットします。poll()呼び出しは、セットのバックグラウンドで発行されますauto.commit.interval.ms。

そして、それは答えと矛盾します。

このことについて詳しく説明していただけますか。

私がこのようなダイアグラムを持っているとしましょう:

0秒-投票
4秒-投票
8秒-投票

オフセットはいつコミットされ、いつオフセットされますか?

14
gstackoverflow

自動コミットチェックはすべてのポーリングで呼び出され、経過時間が設定された時間より長いことをチェックします。その場合、オフセットはコミットされます。

コミット間隔が5秒で、ポーリングが7秒後に発生する場合、コミットは7秒後にのみ発生します。

10
Liju John

ポーリングの完了後、できるだけ早く自動コミットしようとします。自動コミットが有効になっているかどうか、間隔はどのくらいか、自動コミットを実行する次の期限は何かを理解するために、クラスレベルで定義されたローカルフィールドのセットを持つコンシューマコーディネータのソースコードを確認できます。

https://github.com/Apache/kafka/blob/10cd98cc894b88c5d1e24fc54c66361ad9914df2/clients/src/main/Java/org/Apache/kafka/clients/consumer/internals/ConsumerCoordinator.Java#L625

そして、投票を実行してストレージを実行する場所の1つ https://github.com/Apache/kafka/blob/10cd98cc894b88c5d1e24fc54c66361ad9914df2/clients/src/main/Java/org/Apache/kafka/clients/ consumer/internals/ConsumerCoordinator.Java#L279

たとえば、7秒ごとにポーリングが実行され、自動コミットが5に設定されているとします。

0-投票、+期限を5秒に設定

7-投票+期限によるコミット、期限を7 + 5 = 12に更新

14-投票+期限によるコミット、期限を12 + 5 = 17に更新

ただし、ポーリングが3秒ごとに設定され、自動コミットが5に設定されている場合:

0-投票、+期限を5秒に設定

3-投票、コミットなし

6-投票+期限によるコミット、期限を6 + 5 = 11に更新

5
zubrabubra