文書 https://www.safaribooksonline.com/library/view/kafka-the-definitive/9781491936153/ch04.html は、」と言っています-commitを有効にすると、pollへの呼び出しは常に前のpollによって返された最後のオフセットをコミットします。実際に処理されたイベントは不明なので、pollによって返されたすべてのイベントを常に処理してから再度pollを呼び出すことが重要です(またはclose()を呼び出す前に、オフセットを自動的にコミットします)」。その場合、auto.commit.interval.msが前のpoll()
から受信したメッセージを処理するのにかかる時間よりも大きい場合、どのように機能しますか。
より具体的にするために、次のシナリオを考えてください。
_enable.auto.commit=true
auto.commit.interval.ms=10
_
そして、poll()
をループで呼び出します。
1)poll()
への最初の呼び出しで、1000メッセージ(オフセット2000-3000)を受け取り、1000メッセージすべてを処理するのに1ミリ秒かかります
2)poll()
を再度呼び出します。この2回目のpoll()
呼び出しでは、前のpoll()
から返された最新のオフセット3000をコミットする必要がありますが、_auto.commit.interval.ms
_は10ミリ秒に設定されているため、まだオフセットをコミットしません、 正しい?
このシナリオでは、コミットされたオフセットは実際に処理された最新のオフセットよりもさらに遅れますか?
誰かが明確化/確認できますか?
動作を正しく説明します。ただし、あなたの結論は正しくありません。コミットされたオフセットはさらに遅れることはありません。自動コミット間隔が経過した後、ポーリングの次の呼び出しはall処理されたメッセージをコミットします。
たとえば、ポーリングを10ミリ秒ごとに呼び出し、commit-intervalを100ミリ秒に設定するとします。したがって、ポーリングの10回ごとの呼び出しでコミットします(このコミットは、最後の10回のポーリング呼び出しからのすべてのメッセージをカバーします)。