自動コミットの間隔が30秒の場合、何らかの理由でコンシューマーがメッセージを処理できず、30秒より長く保持してからクラッシュする可能性があるとします。とにかく、自動コミットオフセットメカニズムは、コンシューマクラッシュの直前にこのオフセットをコミットしますか?
私の仮定が正しい場合、オフセットがコミットされたためメッセージは失われますが、メッセージ自体は処理されていませんか?
回答 2 件
コンシューマーがメッセージNを受信し、コミットしてから完全に処理する前にクラッシュした場合、デフォルトでは、コンシューマーはこのメッセージが処理されたと見なします。
メッセージはまだブローカー上にあるため、再消費して処理することができます。ただし、アプリケーションには、最後にコミットされた位置から再起動するだけでなく、前のレコードが正常に処理されたかどうかを確認するためのロジックが必要です。
通常、アプリケーションでメッセージの処理に時間がかかる場合は、自動ではなく手動コミットに切り替えます。そうすれば、この問題をコミットして回避するタイミングをより適切に制御できるようになります。
関連記事
- Spring Boot Kafkaメッセージコンシューマと失われたメッセージ
- 大量輸送。カフカ。メッセージ処理中に、佐賀ステートマシンからメッセージを生成する方法
- Kafkaコンシューマーは、別のスレッドでオフセットをコミットできますか?
- カフカストリーム:メッセージを再試行する
- Kafka消費者グループがコミットされていないメッセージを失う
- kafka RESTプロキシでバイナリavroメッセージを読み取ることは可能ですか?
- Kafkaコンシューマーがブートストラップサーバー名を使用してメッセージを消費できない
- Kafka RESTプロキシ:1つのコンシューマグループに2つのコンシューマインスタンスを含めることはできますか
- メッセージの継承とコンシューマーからのメッセージへのアクセスの取得
関連した質問
- Spring Kafkaコンシューマー構成:デフォルト値と少なくとも1回のセマンティクス
- librdkafkaのグループリーダーを特定する
- Kafka消費者テストが常に失敗する
- Kafka enableautocommit = trueおよびcommitSync()が使用されます
- 消費者「group_name」グループは永久にリバランスしています
- 同じメッセージを複数回消費するカフカ
- Kafka:消費者グループによって読み取られるオフセット番号メッセージまで、誰がそれを維持しますか?
- トピックパーティションは、Kafkaクラスターのすべてのブローカーノード間で複製する必要がありますか?
- Java Kafkaコンシューマーは新しいコンシューマーグループIDで正常に動作しますが、シャットダウンして再起動するとメッセージを消費しません
- Kafkaオフセットリセットは、並行消費のためにどのように管理されますか?
コンシューマグループ名が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()が再度呼び出されないか、コンシューマが閉じられていない場合、オフセットをコミットしません。