私はカフカのトピックに重複したメッセージを送信しないようにしたいと考えています。カフカのトピックにメッセージが存在することを確認してください
これを達成する理想的な方法は何ですか? ApacheのカフカのためのJavaクライアントを使用して
、メッセージがKafkaProducer.send
私が参照していますを呼び出す前に存在しているかどうかを確認するために、とにかくそこにあるこのdoc
私はカフカのトピックに重複したメッセージを送信しないようにしたいと考えています。カフカのトピックにメッセージが存在することを確認してください
これを達成する理想的な方法は何ですか? ApacheのカフカのためのJavaクライアントを使用して
、メッセージがKafkaProducer.send
私が参照していますを呼び出す前に存在しているかどうかを確認するために、とにかくそこにあるこのdoc
現在、(Kafka 0.10.1
)、カフカでの書き込みで正確に一度の納品を受ける方法はありません。どのような回避策を実行しても、常にギャップがあり、メッセージが消失したり重複したりする可能性があります。
ただし、Kafkaは重複書き込みを避けることができるidempotent producer(予定は0.10.2
)を追加します。 0.10.2
のリリース予定日はbeginning 2017です。
あなたがいるかどうかを確認することは非現実的です新しいメッセージを送信するたびに同じメッセージが配信されます。別の方法を考えてみましょう:成功または失敗を通知するコールバックを使用してKafkaProducer.sendメソッドを呼び出すことができます。
このアプローチは保存されません。成功した場合でも、書き込みが成功した直後で、コールバックがトリガーされる前にプロデューサのエラーが発生した場合、プロデューサにコールバックが発生しない可能性があります。これをdownvoteする必要があります。新しい回答を追加します。 –
これは、カフカの範囲外です。ランダムアクセスのための適切な索引付けを提供する別のストレージを使用する必要があります。 あなたのニーズに応じて、(分散した)キャッシュ、キーバリューストアなどが可能です。
異なる消費者が重複排除のために異なる戦略を使用する可能性がある(そして一部の消費者は重複を容認する可能性がある)ため、プロデューサーではなく消費者側で行うことが望ましいでしょう。
質問はカフカに書き込むことであり、外部のシステムに書き込むことではありません。 –
KafkaのトピックからDBにデータをエクスポートし、クエリーが存在することを確認することをお勧めしますか? –
あなたは消費者と一緒にデータを読み取るだけでその存在を確認できます。しかし、これは超高価で遅いです。しかし、今すぐ良いパフォーマンスを与える良い解決策はありません。あなたは冪等級のプロデューサーを待つ必要があります。知っていれば、重複した書き込みを受け入れ、それに応じて下流のコンシューマを設計し、そこに重複を除外することは良いようです。 –