私はKafkaコンシューマ用Javaクライアントを作成しています。処理前にすべてのメッセージを非同期にコミットします。リバランスの間に重複メッセージが多数受信されています。カフカコンシューマで重複を取得する
誰もが理由とその回避方法を説明できますか?
私はKafkaコンシューマ用Javaクライアントを作成しています。処理前にすべてのメッセージを非同期にコミットします。リバランスの間に重複メッセージが多数受信されています。カフカコンシューマで重複を取得する
誰もが理由とその回避方法を説明できますか?
すべてのメッセージをコミットした場合でも、カフカコンシューマーは正確に一度の処理保証を提供しません。。
問題は、メッセージを正常に処理してコミットしたときに、コミット直前に再バランスが発生する可能性があることです。したがって、コミットは行われず、すでに処理されたメッセージは再処理されます。
非同期コミットをコミットを使用するため、1つのメッセージごとにすぐにコミットが行われないため、重複の数が増えます。したがって、処理が完了していてまだコミットされていない「飛行中の」メッセージをたくさん持つことができます。再調整では、すべての「飛行中の」メッセージが再処理されます。
したがって、を同期してにすると、重複の数が減ります。ただし、カフカには一回限りの配送保証がないため、重複を完全に回避することはできません。
はかならず1回の配信はしかしカフカの将来のリリースのためのロードマップ上にある:https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging
私はあなたのポイントを得るが、ここで私はprocessing.In前に非同期的にそのような場合にメッセージをコミットしています、任意の重複があってはなりません。 – user3587856
非同期でコミットするため、処理が完了した後もコミットが発生する可能性があります。この場合、コミットが失敗した場合でも重複はあります。同期コミットを使用する必要があります(またはコミット・コールバックを使用し、すでにコミットされたメッセージのみを処理する必要があります)。 –
Btw:https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging –