Kafka Producer Advanced: Kafka Producer Batching
Kafka Producer Batching
Dalam Apache Kafka, batching adalah teknik di mana produser mengelompokkan beberapa pesan ke dalam satu batch sebelum mengirimnya ke broker. Batching meningkatkan throughput, mengurangi latensi jaringan, dan meningkatkan efisiensi penyimpanan serta kompresi. Secara default, produser Kafka berusaha mengirim pesan secepat mungkin, tetapi dengan konfigurasi yang tepat, Anda dapat mengoptimalkan batching untuk mencapai performa tinggi. Artikel ini menjelaskan cara kerja batching, parameter utama seperti linger.ms dan batch.size, serta langkah-langkah praktis untuk mengonfigurasi produser menggunakan kode Java dan alat CLI. Kami juga menyertakan praktik terbaik untuk memastikan keseimbangan antara throughput, latensi, dan penggunaan sumber daya.
Cara Kerja Batching pada Produser Kafka
Produser Kafka mengelompokkan pesan ke dalam batch untuk mengurangi jumlah perjalanan jaringan (network trips) ke broker, sehingga meningkatkan efisiensi. Batching bekerja sebagai berikut:
Pengelompokan Pesan:
Produser mengumpulkan pesan yang ditujukan ke partisi yang sama ke dalam satu batch.
Setiap batch dialokasikan per partisi, sehingga pesan untuk partisi berbeda tidak dicampur dalam satu batch.
Pengiriman Batch:
Secara default, produser mengirim batch secepat mungkin (dengan
linger.ms=0).Produser dapat memiliki hingga 5 permintaan dalam penerbangan (in-flight requests), yang dikontrol oleh
max.in.flight.requests.per.connection(default: 5).Jika lebih banyak pesan harus dikirim sementara 5 permintaan sedang diproses, produser secara otomatis mengelompokkan pesan tambahan ke dalam batch baru hingga permintaan sebelumnya selesai.
Efisiensi Batching:
Batching meningkatkan rasio kompresi jika
compression.typediaktifkan (misalnya,snappy,lz4), karena batch yang lebih besar memiliki lebih banyak data untuk dikompresi.Mengurangi overhead jaringan karena lebih sedikit permintaan dikirim.
Mengurangi penggunaan disk di broker karena batch yang dikompresi disimpan lebih kecil.
Keuntungan Batching
Throughput Tinggi: Mengirim lebih banyak pesan dalam satu permintaan meningkatkan jumlah pesan yang diproses per detik.
Latensi Jaringan Rendah: Mengurangi jumlah perjalanan jaringan.
Efisiensi Kompresi: Batch besar menghasilkan rasio kompresi yang lebih baik, terutama untuk data berbasis teks seperti JSON.
Penggunaan Disk Efisien: Batch yang dikompresi membutuhkan ruang penyimpanan lebih kecil di broker.
Kekurangan Batching
Latensi Tambahan: Menunggu batch terisi (dengan
linger.ms> 0) dapat menambah sedikit latensi.Penggunaan Memori: Batch besar (dengan
batch.sizetinggi) meningkatkan penggunaan memori di sisi produser.Overhead CPU: Jika kompresi diaktifkan, batching memerlukan siklus CPU untuk kompresi.
Parameter Konfigurasi Batching
Dua parameter utama mengontrol batching pada produser Kafka:
1. linger.ms
linger.msDeskripsi: Jumlah milidetik yang bersedia ditunggu produser sebelum mengirim batch.
Default:
0(kirim segera tanpa menunggu).Efek:
Dengan
linger.ms=0, pesan dikirim secepat mungkin, mengurangi peluang batching.Dengan
linger.ms=20, produser menunggu hingga 20ms untuk mengumpulkan lebih banyak pesan ke dalam batch, meningkatkan throughput dengan biaya latensi kecil.Jika batch mencapai ukuran maksimum (
batch.size) sebelumlinger.mshabis, batch akan dikirim segera.
Rekomendasi: Gunakan
linger.ms=5hingga20untuk aplikasi dengan throughput tinggi.
2. batch.size
batch.sizeDeskripsi: Ukuran maksimum batch dalam byte sebelum dikirim.
Default:
16384(16KB).Efek:
Batch besar (misalnya,
32KBatau64KB) meningkatkan kompresi, throughput, dan efisiensi jaringan.Pesan yang lebih besar dari
batch.sizetidak akan di-batch dan dikirim sebagai pesan tunggal.Setiap partisi memiliki batch sendiri, sehingga
batch.sizeyang terlalu besar dapat meningkatkan penggunaan memori, terutama untuk topik dengan banyak partisi.
Rekomendasi: Gunakan
batch.size=32768(32KB) atau65536(64KB) untuk throughput tinggi, tetapi sesuaikan berdasarkan memori yang tersedia.
Konfigurasi Produser untuk Throughput Tinggi
Untuk produser dengan throughput tinggi, kombinasikan batching dengan kompresi. Berikut adalah konfigurasi yang disarankan:
Properties properties = new Properties();
properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");
properties.setProperty(ProducerConfig.LINGER_MS_CONFIG, "20");
properties.setProperty(ProducerConfig.BATCH_SIZE_CONFIG, Integer.toString(32 * 1024)); // 32KB
properties.setProperty(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");
properties.setProperty(ProducerConfig.ACKS_CONFIG, "all");
properties.setProperty(ProducerConfig.RETRIES_CONFIG, Integer.toString(Integer.MAX_VALUE));
properties.setProperty(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "5");
properties.setProperty(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, "120000");Penjelasan:
compression.type=snappy: Mengaktifkan kompresi untuk efisiensi jaringan dan penyimpanan.linger.ms=20: Menunggu 20ms untuk mengisi batch, meningkatkan peluang batching.batch.size=32768: Mengatur ukuran batch ke 32KB untuk kompresi dan throughput lebih baik.Idempotence dan
acks=allmemastikan pengiriman yang andal tanpa duplikasi.
Praktik Konfigurasi dan Pengujian
Berikut adalah langkah-langkah praktis untuk mengonfigurasi produser dengan batching optimal menggunakan kode Java dan alat CLI, serta pengujian untuk memverifikasi performa.
Prasyarat
Pastikan klaster Kafka berjalan (versi ≥ 0.11, mode Zookeeper atau KRaft).
Gunakan ekstensi CLI yang sesuai:
.shuntuk Linux/Mac,.batuntuk Windows.Pastikan broker Kafka aktif di
localhost:9092.Klaster memiliki setidaknya tiga broker untuk mendukung
replication.factor=3.
Langkah-langkah Praktis
1. Buat Topik
Buat topik bernama batch-topic dengan 3 partisi, faktor replikasi 3, dan min.insync.replicas=2:
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic batch-topic \
--partitions 3 --replication-factor 3 \
--config min.insync.replicas=2 \
--config compression.type=producerVerifikasi konfigurasi topik:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic batch-topicContoh Keluaran:
Topic: batch-topic TopicId: XYZ123 PartitionCount: 3 ReplicationFactor: 3 Configs: min.insync.replicas=2,compression.type=producer
Topic: batch-topic Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: batch-topic Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: batch-topic Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,22. Implementasi Produser dengan Batching (Java)
Berikut adalah contoh kode Java untuk produser dengan batching dan kompresi:
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
public class BatchProducer {
public static void main(String[] args) {
// Konfigurasi produser
Properties properties = new Properties();
properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");
properties.setProperty(ProducerConfig.LINGER_MS_CONFIG, "20");
properties.setProperty(ProducerConfig.BATCH_SIZE_CONFIG, Integer.toString(32 * 1024)); // 32KB
properties.setProperty(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");
properties.setProperty(ProducerConfig.ACKS_CONFIG, "all");
properties.setProperty(ProducerConfig.RETRIES_CONFIG, Integer.toString(Integer.MAX_VALUE));
properties.setProperty(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "5");
properties.setProperty(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, "120000");
// Buat produser
KafkaProducer<String, String> producer = new KafkaProducer<>(properties);
// Kirim pesan JSON
for (int i = 0; i < 1000; i++) {
String key = "key-" + i;
String value = "{\"id\": " + i + ", \"data\": \"High throughput JSON message\"}";
ProducerRecord<String, String> record = new ProducerRecord<>("batch-topic", key, value);
producer.send(record, (metadata, exception) -> {
if (exception == null) {
System.out.printf("Pesan dikirim: key=%s, partition=%d, offset=%d%n",
key, metadata.partition(), metadata.offset());
} else {
System.err.printf("Gagal mengirim pesan: %s%n", exception.getMessage());
}
});
}
// Tutup produser
producer.flush();
producer.close();
}
}Penjelasan Kode:
Menggunakan
linger.ms=20danbatch.size=32768untuk batching optimal.Mengaktifkan kompresi
snappyuntuk efisiensi.Mengirim 1000 pesan JSON untuk menguji throughput.
Idempotence memastikan tidak ada duplikasi.
3. Uji dengan Produser Konsol
Jalankan produser konsol dengan batching dan kompresi:
kafka-console-producer.sh --bootstrap-server localhost:9092 \
--topic batch-topic \
--producer-property compression.type=snappy \
--producer-property linger.ms=20 \
--producer-property batch.size=32768 \
--producer-property enable.idempotence=true \
--producer-property acks=all \
--producer-property retries=2147483647 \
--producer-property max.in.flight.requests.per.connection=5 \
--producer-property delivery.timeout.ms=120000 \
--property parse.key=true \
--property key.separator=,Kirim beberapa pesan JSON:
key1,{"id": 1, "data": "High throughput message"}
key2,{"id": 2, "data": "Another batch message"}
key3,{"id": 3, "data": "Optimized batch data"}4. Konsumsi Pesan
Jalankan konsumer untuk memverifikasi pesan:
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic batch-topic \
--from-beginning \
--property print.key=true \
--property key.separator=,Contoh Keluaran:
key1,{"id": 1, "data": "High throughput message"}
key2,{"id": 2, "data": "Another batch message"}
key3,{"id": 3, "data": "Optimized batch data"}5. Uji Performa Batching
Pantau Throughput: Gunakan metrik JMX seperti
BytesOutPerSecuntuk membandingkan throughput dengan dan tanpa batching.Periksa Latensi: Gunakan metrik
RequestLatencyAvguntuk memastikan latensi tetap rendah denganlinger.ms=20.Periksa Penggunaan Memori: Gunakan alat seperti
jvisualvmuntuk memantau memori produser denganbatch.size=32768.Uji Berbagai Nilai: Coba
linger.ms=10danbatch.size=65536untuk melihat dampak pada performa.
Catatan
Pesan Besar: Pesan yang lebih besar dari
batch.sizetidak akan di-batch dan dikirim sebagai pesan tunggal, yang dapat mengurangi efisiensi.Memori: Batch besar meningkatkan penggunaan memori, terutama untuk topik dengan banyak partisi. Sesuaikan
batch.sizeberdasarkan kapasitas memori produser.Mode KRaft: Batching bekerja sama di mode KRaft, tetapi pastikan
compression.type=producerpada topik untuk efisiensi maksimum.
Praktik Terbaik
Gunakan Batching untuk Throughput Tinggi:
Aktifkan batching dengan
linger.ms=5hingga20danbatch.size=32768atau65536untuk aplikasi dengan throughput tinggi.
Kombinasikan dengan Kompresi:
Gunakan
compression.type=snappyataulz4untuk meningkatkan efisiensi batching, terutama untuk data JSON.
Sesuaikan
linger.msdanbatch.size:Gunakan
linger.ms=20untuk menambah peluang batching tanpa latensi berlebihan.Atur
batch.size=32768atau lebih tinggi, tetapi pastikan memori cukup untuk setiap partisi.
Gunakan Idempotence:
Aktifkan
enable.idempotence=trueuntuk mencegah duplikasi, terutama saat menggunakan batching dengan retries.
Pantau Performa:
Gunakan metrik JMX seperti
BytesOutPerSec,RequestLatencyAvg, danBatchSizeAvguntuk memantau efisiensi batching.Periksa penggunaan memori dan CPU untuk mendeteksi bottleneck.
Uji di Lingkungan Non-Produksi:
Uji berbagai kombinasi
linger.msdanbatch.sizeuntuk menemukan pengaturan optimal untuk kasus penggunaan Anda.
Hindari
batch.sizeTerlalu Besar:Jangan atur
batch.sizeterlalu tinggi (misalnya, >1MB) untuk menghindari penggunaan memori berlebihan.
Dokumentasikan Konfigurasi:
Catat pengaturan
linger.ms,batch.size, dancompression.typeuntuk setiap produser, bersama dengan alasan pemilihannya.
Penjelasan Tambahan
Hubungan dengan Kompresi
Batching meningkatkan efektivitas kompresi karena batch besar memiliki lebih banyak data untuk dikompresi, menghasilkan rasio kompresi yang lebih baik.
Parameter
linger.msdanbatch.sizebekerja bersama dengancompression.typeuntuk mengoptimalkan efisiensi jaringan dan penyimpanan.
Pemecahan Masalah
Jika throughput rendah:
Periksa
linger.ms:Tingkatkan ke
20atau lebih tinggi untuk batch lebih besar, tetapi pantau latensi.
Periksa
batch.size:Tingkatkan ke
65536jika memori memadai, tetapi pastikan tidak melebihi kapasitas.
Periksa Kompresi:
Pastikan
compression.typediatur (misalnya,snappy) untuk data berbasis teks.
Jika latensi tinggi:
Kurangi
linger.mske5atau lebih rendah untuk mengurangi penundaan.Gunakan metrik
RequestLatencyAvguntuk mengidentifikasi bottleneck.
Jika penggunaan memori tinggi:
Turunkan
batch.sizeke16384atau sesuaikan jumlah partisi topik.Gunakan alat seperti
jvisualvmuntuk memantau memori produser.
Kesimpulan
Batching pada produser Kafka adalah teknik penting untuk meningkatkan throughput, mengurangi latensi jaringan, dan meningkatkan efisiensi kompresi serta penyimpanan. Dengan mengatur linger.ms=20 dan batch.size=32768, serta mengaktifkan kompresi seperti snappy, Anda dapat mengoptimalkan performa untuk aplikasi dengan throughput tinggi. Contoh kode Java dan CLI menunjukkan cara menerapkan batching dengan konfigurasi aman, sementara praktik terbaik seperti pengujian, pemantauan metrik, dan dokumentasi memastikan operasi yang efisien. Batching sangat penting di lingkungan produksi, terutama jika dikombinasikan dengan kompresi dan idempotence.
Last updated