Selain jawaban yang diterima yang sangat membantu, saya ingin menambahkan beberapa detail lagi
Mempartisi
Secara default, Kafka menggunakan kunci pesan untuk memilih partisi topik yang ditulinya. Ini dilakukan di DefaultPartitioner
by
kafka.common.utils.Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
Jika tidak ada kunci yang diberikan, maka Kafka akan mempartisi data secara acak dengan cara round-robin.
Di Kafka, dimungkinkan untuk membuat Partitioner Anda sendiri dengan memperluas Partitioner
kelas. Untuk ini, Anda perlu mengganti partition
metode yang memiliki tanda tangan:
int partition(String topic,
Object key,
byte[] keyBytes,
Object value,
byte[] valueBytes,
Cluster cluster)
Biasanya, kunci pesan Kafka digunakan untuk memilih partisi. Tanpa kunci, Anda perlu mengandalkan nilai yang mungkin jauh lebih rumit untuk diproses.
Memerintah
Seperti yang dinyatakan dalam jawaban yang diberikan, Kafka memiliki jaminan untuk memesan pesan hanya di tingkat partisi.
Katakanlah Anda ingin menyimpan transaksi keuangan untuk pelanggan Anda dalam topik Kafka dengan dua partisi. Pesan akan terlihat seperti (key: value)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Karena kami belum menentukan kunci, kedua partisi akan terlihat seperti
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Konsumen Anda yang membaca topik tersebut dapat memberi tahu Anda bahwa saldo pada akun adalah 600 pada waktu tertentu meskipun itu tidak pernah terjadi! Hanya karena itu membaca semua pesan di partisi 0 sebelum pesan di partisi 1.
Dengan kunci yang masuk akal (seperti customerId) ini dapat dihindari karena partitoning akan seperti ini:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Pemadatan log
Tanpa kunci sebagai bagian dari pesan Anda, Anda tidak akan dapat menyetel konfigurasi topik cleanup.policy
ke compacted
. Menurut dokumentasi, "pemadatan log memastikan bahwa Kafka akan selalu mempertahankan setidaknya nilai terakhir yang diketahui untuk setiap kunci pesan dalam log data untuk satu partisi topik.".
Pengaturan yang baik dan bermanfaat ini tidak akan tersedia tanpa kunci apa pun.
Penggunaan Kunci
Dalam kasus penggunaan kehidupan nyata, kunci pesan Kafka dapat berpengaruh besar pada kinerja dan kejelasan logika bisnis Anda.
Misalnya, kunci dapat digunakan secara alami untuk mempartisi data Anda. Karena Anda dapat mengontrol konsumen untuk membaca dari partisi tertentu, ini dapat berfungsi sebagai filter yang efisien. Selain itu, kunci dapat menyertakan beberapa data meta pada nilai sebenarnya dari pesan yang membantu Anda mengontrol pemrosesan selanjutnya. Kunci biasanya lebih kecil dari nilai dan oleh karena itu lebih mudah untuk mengurai kunci daripada nilai keseluruhan. Pada saat yang sama, Anda dapat menerapkan semua serialisasi dan pendaftaran skema seperti yang dilakukan dengan nilai Anda juga dengan kunci.
Sebagai catatan, ada juga konsep Header yang bisa digunakan untuk menyimpan informasi, lihat dokumentasi .