2016-11-14 13 views
0

私はKafkaコンシューマ用Javaクライアントを作成しています。処理前にすべてのメッセージを非同期にコミットします。リバランスの間に重複メッセージが多数受信されています。カフカコンシューマで重複を取得する

誰もが理由とその回避方法を説明できますか?

答えて

0

すべてのメッセージをコミットした場合でも、カフカコンシューマーは正確に一度の処理保証を提供しません。

問題は、メッセージを正常に処理してコミットしたときに、コミット直前に再バランスが発生する可能性があることです。したがって、コミットは行われず、すでに処理されたメッセージは再処理されます。

非同期コミットをコミットを使用するため、1つのメッセージごとにすぐにコミットが行われないため、重複の数が増えます。したがって、処理が完了していてまだコミットされていない「飛行中の」メッセージをたくさん持つことができます。再調整では、すべての「飛行中の」メッセージが再処理されます。

したがって、を同期してにすると、重複の数が減ります。ただし、カフカには一回限りの配送保証がないため、重複を完全に回避することはできません。

はかならず1回の配信はしかしカフカの将来のリリースのためのロードマップ上にある:https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging

+0

私はあなたのポイントを得るが、ここで私はprocessing.In前に非同期的にそのような場合にメッセージをコミットしています、任意の重複があってはなりません。 – user3587856

+0

非同期でコミットするため、処理が完了した後もコミットが発生する可能性があります。この場合、コミットが失敗した場合でも重複はあります。同期コミットを使用する必要があります(またはコミット・コールバックを使用し、すでにコミットされたメッセージのみを処理する必要があります)。 –

+0

Btw:https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging –

関連する問題