2

シンプルな Producer-->Kafka-->Consumer アプリケーションを Java で実装しようとしています。メッセージを正常に生成および消費できますが、コンシューマーを再起動すると問題が発生し、すでに消費されたメッセージの一部が Kafka からコンシューマーによって再び取得されます (すべてのメッセージではなく、最後のいくつかのメッセージ消費されたメッセージ)。

コンシューマを設定autooffset.reset=largestし、autocommit.interval.msプロパティを 1000 ミリ秒に設定しました。

この「既に消費されたメッセージの再配信」は既知の問題ですか、それとも他に不足している設定はありますか?

基本的に、以前に消費されたメッセージが消費者によって取得/消費されないようにする方法はありますか?

4

1 に答える 1

3

Kafka は Zookeeper を使用してコンシューマー オフセットを格納します。Zookeeper の操作は非常に遅いため、すべてのメッセージを消費した後にオフセットをコミットすることはお勧めできません。

終了前にトピック オフセットを手動でコミットするシャットダウン フックをコンシューマーに追加することができます。ただし、これは特定の状況 (jvm のクラッシュなどkill -9) では役に立ちません。このような状況を防ぐために、各メッセージ (ファイルまたはローカル データベース) の処理後にローカルでオフセットをコミットし、1000 ミリ秒ごとに Zookeeper にオフセットをコミットするカスタム コミット ロジックを実装することをお勧めします。コンシューマーの起動時に、これらの両方の場所を照会する必要があり、消費オフセットとして最大 2 つの値を使用する必要があります。

于 2013-05-01T08:33:00.443 に答える