2017-08-09 14 views
0

私たちはapache kafka 0.10.0.xとspring 3.xで動作しており、spring framework version 4.xでサポートされているようにspring kafkaを使用することはできません。Kafkaのパフォーマンスを向上させるプロデューサ

したがって、ネイティブのKafka Producer APIを使用してメッセージを生成しています。

私の懸念は、私のプロデューサーのパフォーマンスです。実際には、producer.sendへの呼び出しが実際にKafkaブローカーとの接続を確立し、メッセージをバッファーに入れてから、送信しようとしてからproducer.send()で指定されたコールバックメソッドを呼び出すと考えています。

KafkaProducerのドキュメントによれば、送信を実行するためにバッファと別のI/Oスレッドを使用し、リソースが漏れないように適切に閉じておく必要があります。

これは、私が呼び出すたびに100sのメッセージが送信されると、それは高価なI/O操作であるブローカに接続しようとしていることを意味します(producer.send())。

私が間違っている場合、またはKafkaProducerを使用する方が良いと提言することができますか?

答えて

1

あなたの理解は部分的に正しいです。

@leshkinには、送信するメッセージのバッファリングをどのように処理するかを調整するための設定パラメータがあることが指摘されているため、KafkaProducer は、

しかし、バッファリング戦略とは無関係に、プロデューサは、トピックリーダーブローカーとの確立された接続のキャッシュを処理します。

実際には、生産者がconnections.max.idle.msパラメータ(デフォルトは9分)を使用してこのような接続を維持する期間を調整できます。

元の質問に応答するために、ブローカへの接続を確立するためのI/Oコストは、最初のsend呼び出しでのみ発生し、送信するデータがある限り、償却されます。

+0

Ok - これは、プロパティを微調整して適切に使用するのに役立ちます。これを春に使用する推奨の方法はありますか?私は、シングルトンのBeanとしてKafkaProducerを作成し、それを必要に応じて注入することを考えていましたが、この場合、リソースの漏れやパフォーマンスの影響がありますか? –

+0

さて、KafkaProducerを使うための再考された方法は、単一のインスタンスを持ち、スレッド間で共有することです。実際にあなたがやろうとしていることは、大丈夫と思われます。少なくともそれは私がまだ春を使用していたときに何年前にそれをやるかということです。その間に、このようなことをする春の慣用的なやり方が変わったのかどうかは分かりません。ところで、答えが満足できると思うなら、それを受け入れてください。 – nivox

1

kafkaプロデューサの2つの重要な設定パラメータは、 'batch.size'と 'linger.ms'です。つまり、基本的には選択肢があります。プロデューサのバッチがいっぱいになるまで、またはプロデューサのタイムアウトまで待つことができます。

  • batch.size - これは、カフカプロデューサが送信前にバッチ処理しようとするメッセージの上限で、バイト単位で指定します。

  • linger.ms - より多くのメッセージを同じバッチで蓄積できるようにするために、プロデューサが送信するまでにどのくらい時間がかかりますか?

あなたの使用状況によって異なりますが、これらのパラメータを詳しく調べることをお勧めします。

関連する問題