bugfix> apache-kafka > 投稿

自動コミットの間隔が30秒の場合、何らかの理由でコンシューマーがメッセージを処理できず、30秒より長く保持してからクラッシュする可能性があるとします。とにかく、自動コミットオフセットメカニズムは、コンシューマクラッシュの直前にこのオフセットをコミットしますか?

私の仮定が正しい場合、オフセットがコミットされたためメッセージは失われますが、メッセージ自体は処理されていませんか?

回答 2 件
  • コンシューマグループ名がTestであり、コンシューマグループに単一のコンシューマがあるとします。

    自動コミットが有効になっている場合、オフセットはpoll()呼び出し中およびコンシューマーのクローズ中にのみコミットされます。

    たとえば、auto.commit.interval.msは5秒であり、poll()を呼び出すたびに7秒かかります。 poll()を呼び出すたびに、自動コミット間隔が経過したかどうかを確認し、経過した場合は、上記の例のようにオフセットをコミットします。

    オフセットは、消費者の閉鎖時にもコミットされます。

    ドキュメントから-

    「コンシューマを閉じ、必要なクリーンアップのためにデフォルトのタイムアウトである30秒まで待機します。自動コミットが有効になっている場合、デフォルトのタイムアウト内で可能であれば現在のオフセットをコミットします。」

    詳細についてはこちらをご覧ください-

    https://kafka.apache.org/10/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html

    さて、あなたの質問に、poll()が再度呼び出されないか、コンシューマが閉じられていない場合、オフセットをコミットしません。

  • コンシューマーがメッセージNを受信し、コミットしてから完全に処理する前にクラッシュした場合、デフォルトでは、コンシューマーはこのメッセージが処理されたと見なします。

    メッセージはまだブローカー上にあるため、再消費して処理することができます。ただし、アプリケーションには、最後にコミットされた位置から再起動するだけでなく、前のレコードが正常に処理されたかどうかを確認するためのロジックが必要です。

    通常、アプリケーションでメッセージの処理に時間がかかる場合は、自動ではなく手動コミットに切り替えます。そうすれば、この問題をコミットして回避するタイミングをより適切に制御できるようになります。

あなたの答え