メッセージを失うことができないKafka version : 0.9.0.1
アプリケーションを開発しました。同期モードで使用するKafkaプロデューサのパフォーマンスを向上させる方法
私はメッセージを正しい順序で消費しなければならないという制約があります。
私が実装したメッセージが失われないようにするには、アプリケーションコード内で再試行し、プロデューサをack=all
に設定してください。
例外ハンドリングを実行し、即時にフェイルを実行するには、Future
のProducer.send()
から、get()
が即時返されます。
final Future<RecordMetadata> futureRecordMetadata = KAFKA_PRODUCER.send(producerRecord);
futureRecordMetadata.get();
この方法は、すべてのメッセージの配信を保証するうえでは問題ありませんが、パフォーマンスは完全に受け入れられません。
たとえば、ack=all
で152,125メッセージを送信するのに34分かかります。
私はfutureRecordMetadata.get()をコメントアウトすると、7分で1,089,125のメッセージを送信できます。
ack=all
をack=1
に変更すると、30分で815,038を送信できます。 ack=all
とack=1
の間に大きな違いがあるのはなぜですか?
しかし、ブロックしないでくださいget()
私はメッセージが安全に到着したかどうかを知る方法がありません。
私はCallback
を送信に渡して、私のためにKafkaを再試行することができますが、この方法ではメッセージが順不同で消費されるという欠点があります。
は、私はそれのために任意の値を設定するとrequest.required.acks
設定は私が保証して彼らは常に到着します、
130 [NamedConnector-Monitor] WARN org.apache.kafka.clients.producer.ProducerConfig - The configuration request.required.acks = -1 was supplied but isn't a known config.
が非同期カフカメッセージを送信することが可能です。この警告を受けるが、私のために救うことができると思いました安全かつ正しい順序で?
UPDATE 001
は、私はTOPICから直接カフカのメッセージキーの順序でメッセージを消費する可能性がとにかくありますか?
または、オフセットした順序でメッセージを消費し、プログラムで並べ替える必要がありますか? カフカメッセージのキーの順序?
私たちはどのようなデータを扱っているのですか? – Hector
これは私たちがどのような種類のデータを送信することを保証するものなのですか?データベースのbinlog? –
DBMSの挿入、更新、および削除に続く行の前後のデータベース。それで私のメッセージを正しい順序で保管しなければならないのです – Hector