みなさんこんにちは!今回はKafkaにおけるパフォーマンス向上のために Producer をどのように設定するかについて解説していきます。
Producer の重要な設定
Kafkaを運用していくうえで重要な要素として「スループット」と「耐障害性」があげられます。
二つの要素をどちらも向上させていくことが理想ですが、トレードオフ(どちらかを良くすると、もう一方は性能が悪くなる)の関係であるため、ユースケースに応じてどちらが優先されるかを決めていくことが大切です。
Producer に限らずですが、Kafkaではスループット、耐障害性に関するパラメーター値を利用シーンに応じて変更(チューニング)することができます。
そこで今回はスループットと耐障害性の最適化のためのチューニングできるProducerパラメーター値を、重要なものだけに限定して解説していきます。
スループット面
スループットでは、メッセージをいかに効率よく送信できるか、という指標となっています。効率性を重視したパラメーター値の一例として以下があります。
batch.size
batchに入る量の上限値で、デフォルトは16KBです。
多くのデータが流入してくる場合にこの値を大きくするとスループットが向上します
linger.ms
batchにデータを入れる時間をどれくらい延長するかを決定します。デフォルトは0msです。
batch化する時間をコントロールする役割ですが、スループット向上にはあまり使われません。
batch.sizeが大きくできない状況で、意図的にbatchを満タンにしてから送信する、等の場合に使われます。
なお、batchデータ送信の条件は以下の通りです。
- データを入れるbatchがbatch.sizeに達した場合
- データを入れるのにかかった時間がbatch化する所定の時間+linger.msを超えた場合
- batch化する所定の時間にも設定値が存在しますが、ここでは省略します。
compression.type
Producerはデータに対し圧縮することが可能です。大量データを圧縮して負荷を下げることでスループットが向上します。
圧縮の種類はgzip, snappy, lz4, zstdの4種類から選択できます。
耐障害性面
Kafkaのもう一つ重要な側面として耐障害性があります。これはいかにメッセージが失われない、もしくは同じメッセージが増えないようにするか、という指標になっています。
ここでも重要な設定値は赤色で示します。
acks
Brokerが正常にメッセージを処理できたら、Producerにackを返します。ackの返し方は以下の3つの方法があります。
ちなみにですが、Brokerがメッセージを処理することを「commitする」と言います。commitについてはBroker編でまたお伝えします。
- Acks=0・・・Brokerに確認をさせない(スループット最優先)
スループットは非常に高いですが、メッセージが失われる危険性があります。
- Acks=1・・・Leader Brokerのみメッセージを処理したか確認をさせる
ack=0よりは耐障害性がありますがリーダーだけackを送るため、フォロワーが複製できているかの保証がありません。
- Acks=all・・・Followerも含めた全てのReplicaからメッセージが処理できたか確認をさせる(耐障害性の担保)
耐障害性の観点からは、この設定値が一番推奨されます
retry
エラーに応じてメッセージを再送信する回数を調整しますが、通常はこの設定値を調整することはありません!
idempodence
メッセージが重複するのを防ぐ設定値です。
エラーで送れなかったメッセージが正常に送信されていた場合、もう一度送信するとメッセージ被りが起きてしまうことがあります。
Idempodenceを有効にすることで、再び同じメッセージを送った時に複製判定を検知してそのメッセージを削除します。
なお、ここでは正常に処理したことの確認でAckを使用しているため、Ack=1もしくはallに設定するようにしてください!
まとめ
この記事では、「Producer」においてスループット、耐障害性を向上する上でどのような設定値が重要なのかを解説しました。
次回ではKafkaからデータを受け取る役目であるConsumerについて解説していきたいと思います!
最後まで読んでいただきありがとうございました!