Kafka Producer Advanced: Kafka Producer Acks Deep Dive
Kafka Producer Acks Deep Dive
Dalam Apache Kafka, parameter konfigurasi produser acks
menentukan tingkat pengakuan (acknowledgment) yang diperlukan dari broker sebelum pesan dianggap berhasil ditulis. Parameter ini bekerja bersama dengan konfigurasi min.insync.replicas
untuk menyeimbangkan antara ketahanan data (durability), ketersediaan (availability), dan performa. Artikel ini akan menjelaskan secara mendalam opsi acks
, implikasinya terhadap operasi Kafka, hubungannya dengan replikasi dan In-Sync Replicas (ISR), serta langkah-langkah praktis untuk mengonfigurasi min.insync.replicas
menggunakan alat CLI. Kami juga menyertakan contoh lengkap dan praktik terbaik untuk membantu Anda mengelola konfigurasi produser dengan tepat.
Pengenalan Parameter acks
acks
Parameter acks
pada produser Kafka menentukan jumlah broker yang harus mengakui penerimaan pesan sebelum dianggap berhasil ditulis. Produser hanya mengirim data ke broker pemimpin (leader) untuk partisi tertentu, tetapi tingkat pengakuan tergantung pada pengaturan acks
. Parameter ini berinteraksi dengan min.insync.replicas
, yang menentukan jumlah minimum replika dalam In-Sync Replicas (ISR) yang harus memiliki data sebelum pesan dianggap committed.
Nilai acks
yang Tersedia
acks
yang TersediaDefault:
Kafka < v3.0:
acks=1
Kafka ≥ v3.0:
acks=all
Opsi:
acks=0
: Tidak menunggu pengakuan dari broker.acks=1
: Menunggu pengakuan hanya dari pemimpin partisi.acks=all
: Menunggu pengakuan dari semua replika dalam ISR.
Hubungan dengan min.insync.replicas
min.insync.replicas
Parameter
min.insync.replicas
menentukan jumlah minimum replika ISR (termasuk pemimpin) yang harus mengakui pesan agar dianggap berhasil ditulis saatacks=all
.Dapat dikonfigurasi pada level topik atau broker.
Default:
1
pada level broker.Contoh: Dengan
replication.factor=3
danmin.insync.replicas=2
, setidaknya dua replika (termasuk pemimpin) harus mengakui pesan untuk dianggap committed.
Detail Opsi acks
acks
acks=0
acks=0
Deskripsi: Produser menganggap pesan berhasil ditulis segera setelah dikirim, tanpa menunggu pengakuan dari broker.
Keuntungan:
Throughput tertinggi karena tidak ada overhead jaringan untuk pengakuan.
Cocok untuk data yang dapat ditoleransi kehilangannya, seperti metrik atau log non-kritis.
Kekurangan:
Tidak ada jaminan bahwa pesan diterima oleh broker.
Jika broker offline atau terjadi kesalahan, pesan akan hilang tanpa sepengetahuan produser.
Kasus Penggunaan: Pengumpulan metrik, log sementara, atau data dengan toleransi kehilangan tinggi.
acks=1
acks=1
Deskripsi: Produser menganggap pesan berhasil ditulis setelah pemimpin partisi mengakui penerimaan pesan.
Keuntungan:
Performa lebih baik dibandingkan
acks=all
karena hanya menunggu pengakuan dari pemimpin.Produser dapat mencoba ulang (retry) jika tidak menerima pengakuan.
Kekurangan:
Tidak menjamin replikasi ke replika lain, karena replikasi dilakukan di latar belakang.
Jika pemimpin gagal sebelum replikasi selesai, data dapat hilang.
Kasus Penggunaan: Aplikasi yang membutuhkan keseimbangan antara performa dan ketahanan, tetapi dapat mentolerir kehilangan data sesekali.
acks=all
acks=all
Deskripsi: Produser menganggap pesan berhasil ditulis hanya setelah semua replika dalam ISR mengakui penerimaan pesan.
Keuntungan:
Ketahanan data tertinggi, karena pesan dijamin ditulis ke semua replika ISR yang ditentukan oleh
min.insync.replicas
.Cocok untuk aplikasi yang memerlukan jaminan ketahanan tinggi, seperti transaksi keuangan.
Kekurangan:
Latensi lebih tinggi karena produser harus menunggu semua replika ISR mengakui.
Jika jumlah replika ISR di bawah
min.insync.replicas
, produser akan menerimaNotEnoughReplicasException
dan tidak dapat menulis data.
Kasus Penggunaan: Data kritis seperti transaksi keuangan, pesanan pelanggan, atau data yang memerlukan konsistensi tinggi.
Implikasi min.insync.replicas
min.insync.replicas
Contoh:
Dengan
replication.factor=3
danmin.insync.replicas=2
, produser denganacks=all
memerlukan setidaknya dua replika (termasuk pemimpin) untuk mengakui pesan.Jika hanya satu replika tersedia (misalnya, dua broker gagal), produser akan menerima
NotEnoughReplicasException
.
Efek pada Ketersediaan:
Dengan
acks=all
danmin.insync.replicas=M
untukreplication.factor=N
, sistem dapat mentolerir hinggaN-M
kegagalan broker tanpa kehilangan ketersediaan penulisan.Contoh: Untuk
replication.factor=3
danmin.insync.replicas=2
, sistem dapat mentolerir satu kegagalan broker.
Ketahanan dan Ketersediaan Topik
Ketahanan (Durability)
Untuk
replication.factor=N
, Kafka dapat mentolerir hinggaN-1
kegagalan broker permanen tanpa kehilangan data, karena data tersedia di replika lain.Contoh: Dengan
replication.factor=3
, sistem dapat kehilangan hingga dua broker dan masih dapat memulihkan data.
Ketersediaan (Availability)
Pembacaan: Selama setidaknya satu replika dalam ISR tersedia, topik dapat dibaca.
Penulisan:
acks=0 atau acks=1: Selama pemimpin partisi tersedia, topik dapat ditulis, meskipun replika lain offline.
acks=all:
Dengan
min.insync.replicas=1
: Topik tetap tersedia selama pemimpin tersedia (mentolerirN-1
kegagalan broker).Dengan
min.insync.replicas=2
(untukreplication.factor=3
): Topik tersedia selama setidaknya dua replika ISR aktif, mentolerir satu kegagalan broker.Dengan
min.insync.replicas=3
(untukreplication.factor=3
): Tidak dapat mentolerir kegagalan broker, karena semua replika harus aktif, sehingga tidak praktis.
Konfigurasi Populer
acks=all dan min.insync.replicas=2 adalah kombinasi paling umum untuk menyeimbangkan ketahanan dan ketersediaan.
Dengan
replication.factor=3
, konfigurasi ini memungkinkan sistem mentolerir satu kegagalan broker sambil memastikan data ditulis ke setidaknya dua replika.
Praktik Konfigurasi min.insync.replicas
min.insync.replicas
Berikut adalah langkah-langkah praktis untuk mengonfigurasi min.insync.replicas
pada topik dan broker, dengan contoh lengkap menggunakan alat CLI Kafka.
Prasyarat
Pastikan klaster Kafka berjalan (mode Zookeeper atau KRaft).
Gunakan ekstensi CLI yang sesuai:
.sh
untuk Linux/Mac,.bat
untuk Windows.Pastikan broker Kafka aktif di
localhost:9092
.Klaster memiliki setidaknya tiga broker untuk mendukung
replication.factor=3
.
Langkah-langkah Konfigurasi
1. Buat Topik
Buat topik bernama configured-topic
dengan 3 partisi dan faktor replikasi 3:
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic configured-topic \
--partitions 3 --replication-factor 3
2. Verifikasi Konfigurasi Topik Awal
Periksa konfigurasi topik untuk memastikan tidak ada pengaturan override:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic
Contoh Keluaran:
Topic: configured-topic TopicId: CDU7SBxBQ1mzJGnuH68-cQ PartitionCount: 3 ReplicationFactor: 3 Configs:
Topic: configured-topic Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: configured-topic Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: configured-topic Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Tidak ada override konfigurasi (min.insync.replicas
menggunakan default broker, yaitu 1).
3. Atur min.insync.replicas
pada Level Topik
Atur min.insync.replicas=2
untuk topik configured-topic
:
kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type topics \
--entity-name configured-topic \
--add-config min.insync.replicas=2
4. Verifikasi Perubahan Konfigurasi
Periksa kembali konfigurasi topik:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic
Contoh Keluaran:
Topic: configured-topic TopicId: CDU7SBxBQ1mzJGnuH68-cQ PartitionCount: 3 ReplicationFactor: 3 Configs: min.insync.replicas=2
Topic: configured-topic Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: configured-topic Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: configured-topic Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Sekarang, min.insync.replicas=2
terlihat sebagai override konfigurasi topik.
5. (Opsional) Hapus Konfigurasi Override
Jika Anda ingin menghapus override dan kembali ke default broker:
kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type topics \
--entity-name configured-topic \
--delete-config min.insync.replicas
Verifikasi kembali untuk memastikan konfigurasi dihapus:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic
6. Atur min.insync.replicas
pada Level Broker
a. Melalui File Konfigurasi
Buka file config/server.properties
dan tambahkan:
min.insync.replicas=2
Restart broker untuk menerapkan perubahan:
kafka-server-stop.sh
kafka-server-start.sh config/server.properties
b. Melalui CLI (Konfigurasi Dinamis)
Atur min.insync.replicas=2
secara dinamis tanpa restart:
kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type brokers \
--entity-default \
--add-config min.insync.replicas=2
Verifikasi konfigurasi broker:
kafka-configs.sh --bootstrap-server localhost:9092 \
--describe --entity-type brokers \
--entity-default
Contoh Keluaran:
Default configs for brokers in the cluster are: min.insync.replicas=2 sensitive=false synonyms={DYNAMIC_DEFAULT_BROKER_CONFIG:min.insync.replicas=2}
Hapus konfigurasi dinamis (opsional):
kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type brokers \
--entity-default \
--delete-config min.insync.replicas
7. Uji Produser dengan acks
Jalankan produser konsol dengan pengaturan acks
:
kafka-console-producer.sh --bootstrap-server localhost:9092 \
--topic configured-topic \
--producer-property acks=all
Kirim beberapa pesan:
Test message 1
Test message 2
Jalankan konsumer untuk memverifikasi:
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic configured-topic \
--from-beginning
Jika hanya satu replika tersedia (misalnya, dua broker offline), produser dengan acks=all
dan min.insync.replicas=2
akan gagal dengan NotEnoughReplicasException
.
Catatan
Konfigurasi topik menimpa konfigurasi broker. Jika
min.insync.replicas
diatur di level topik, nilai ini akan digunakan daripada default broker.Restart broker diperlukan untuk perubahan
server.properties
, tetapi konfigurasi dinamis melaluikafka-configs.sh
lebih fleksibel untuk lingkungan produksi.
Praktik Terbaik
Gunakan
acks=all
untuk Data Kritis:Untuk aplikasi yang memerlukan ketahanan tinggi (misalnya, transaksi keuangan), gunakan
acks=all
denganmin.insync.replicas=2
untuk memastikan data ditulis ke setidaknya dua replika.
Pilih
min.insync.replicas
yang Sesuai:Untuk
replication.factor=N
, aturmin.insync.replicas=N-1
untuk menyeimbangkan ketahanan dan ketersediaan (misalnya,replication.factor=3
,min.insync.replicas=2
).
Gunakan Konfigurasi Dinamis:
Gunakan
kafka-configs.sh
untuk mengubahmin.insync.replicas
secara dinamis tanpa restart broker:kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --add-config min.insync.replicas=2
Pantau Kesehatan Klaster:
Gunakan metrik JMX seperti
UnderReplicatedPartitions
danNotEnoughReplicasException
untuk mendeteksi masalah replikasi.Periksa status ISR:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic
Uji di Lingkungan Non-Produksi:
Simulasikan kegagalan broker untuk menguji perilaku
acks=all
danmin.insync.replicas
sebelum menerapkannya di produksi.
Kombinasikan dengan Faktor Replikasi:
Gunakan
replication.factor=3
denganmin.insync.replicas=2
untuk konfigurasi standar industri yang andal.
Hindari
acks=0
di Produksi:Gunakan
acks=0
hanya untuk data non-kritis dengan toleransi kehilangan tinggi, seperti metrik.
Dokumentasikan Konfigurasi:
Catat pengaturan
acks
danmin.insync.replicas
untuk setiap topik, bersama dengan alasan pemilihannya, untuk memudahkan pemeliharaan.
Penjelasan Tambahan
Hubungan dengan ISR
In-Sync Replicas (ISR) adalah replika yang sinkron dengan pemimpin partisi. Parameter
min.insync.replicas
memastikan bahwa pesan hanya dianggap committed jika ditulis ke jumlah minimum replika ISR.Dengan
acks=all
, pemimpin menahan pesan dalam buffer hingga semua replika ISR yang diperlukan mengakui, yang meningkatkan latensi tetapi menjamin ketahanan.
Mode KRaft
Dalam mode KRaft (Kafka tanpa Zookeeper, mulai versi 3.3), manajemen ISR dan pemilihan pemimpin lebih efisien karena controller Kafka menangani metadata. Namun, logika acks
dan min.insync.replicas
tetap sama. Uji konfigurasi ini dalam mode KRaft untuk memastikan kompatibilitas.
Pemecahan Masalah
Jika produser gagal dengan NotEnoughReplicasException
:
Periksa status ISR:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic
Pastikan jumlah replika dalam ISR memenuhi
min.insync.replicas
.Periksa kesehatan broker:
kafka-broker-api-versions.sh --bootstrap-server localhost:9092
Tingkatkan
min.insync.replicas
atau pulihkan broker yang gagal.
Jika performa menurun:
Tinjau latensi akibat
acks=all
menggunakan metrik sepertiRequestLatencyAvg
.Pertimbangkan mengurangi
min.insync.replicas
(misalnya, ke 1) untuk data yang kurang kritis.
Kesimpulan
Parameter acks
pada produser Kafka adalah komponen kritis untuk menyeimbangkan ketahanan, ketersediaan, dan performa. Dengan acks=0
, Anda mendapatkan throughput maksimum tetapi tanpa jaminan pengiriman. Dengan acks=1
, Anda mendapatkan performa lebih baik tetapi risiko kehilangan data. Dengan acks=all
dan min.insync.replicas
yang sesuai, Anda memastikan ketahanan tinggi dengan biaya latensi. Konfigurasi populer acks=all
dan min.insync.replicas=2
dengan replication.factor=3
adalah standar untuk aplikasi kritis. Dengan menggunakan alat CLI seperti kafka-configs.sh
, Anda dapat mengatur min.insync.replicas
secara dinamis, sementara praktik terbaik seperti pemantauan dan pengujian membantu memastikan operasi yang andal.
Last updated