2016-08-24 12 views
1

メッセージを失うことができないKafka version : 0.9.0.1アプリケーションを開発しました。同期モードで使用するKafkaプロデューサのパフォーマンスを向上させる方法

私はメッセージを正しい順序で消費しなければならないという制約があります。

私が実装したメッセージが失われないようにするには、アプリケーションコード内で再試行し、プロデューサをack=allに設定してください。

例外ハンドリングを実行し、即時にフェイルを実行するには、FutureProducer.send()から、get()が即時返されます。

final Future<RecordMetadata> futureRecordMetadata = KAFKA_PRODUCER.send(producerRecord); 
futureRecordMetadata.get(); 

この方法は、すべてのメッセージの配信を保証するうえでは問題ありませんが、パフォーマンスは完全に受け入れられません。

たとえば、ack=allで152,125メッセージを送信するのに34分かかります。

私はfutureRecordMetadata.get()をコメントアウトすると、7分で1,089,125のメッセージを送信できます。

ack=allack=1に変更すると、30分で815,038を送信できます。 ack=allack=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から直接カフカのメッセージキーの順序でメッセージを消費する可能性がとにかくありますか?

または、オフセットした順序でメッセージを消費し、プログラムで並べ替える必要がありますか? カフカメッセージのキーの順序?

答えて

3

合計注文が必要な場合は、送信パフォーマンスが悪いです。 (実際には全体の注文シナリオは非常にまれです)。
パーティションの順序が受け入れられる場合は、複数のスレッドプロデューサを使用できます。パーティションごとに1つのプロデューサ/スレッド。

+0

私たちはどのようなデータを扱っているのですか? – Hector

+0

これは私たちがどのような種類のデータを送信することを保証するものなのですか?データベースのbinlog? –

+0

DBMSの挿入、更新、および削除に続く行の前後のデータベース。それで私のメッセージを正しい順序で保管しなければならないのです – Hector

関連する問題