Apa tujuan perpesanan berbasis pasangan kunci / nilai Kafka? [Tutup]

97

Semua contoh dari Kafka | produser menunjukkan ProducerRecordpasangan kunci / nilai tidak hanya memiliki tipe yang sama (semua contoh menunjukkan <String,String>), tetapi memiliki nilai yang sama . Sebagai contoh:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));

Namun di dokumen Kafka, saya tidak bisa menemukan di mana konsep kunci / nilai (dan tujuan / utilitas yang mendasarinya) dijelaskan. Dalam perpesanan tradisional (ActiveMQ, RabbitMQ, dll.) Saya selalu mengirim pesan ke topik / antrian / pertukaran tertentu. Tetapi Kafka adalah pialang pertama yang tampaknya membutuhkan pasangan kunci / nilai alih-alih hanya pesan string biasa.

Jadi saya bertanya: Apa tujuan / kegunaan mewajibkan produsen mengirimkan pasangan KV?

smeeb
sumber

Jawaban:

93

Kafka menggunakan abstraksi dari log terdistribusi yang terdiri dari partisi . Memisahkan log menjadi beberapa partisi memungkinkan untuk mengubah skala sistem.

Kunci digunakan untuk menentukan partisi di dalam log tempat pesan dapat ditambahkan. Sedangkan nilai sebenarnya adalah payload dari pesan tersebut. Contoh-contoh sebenarnya tidak terlalu "baik" dalam hal ini; biasanya Anda akan memiliki tipe kompleks sebagai nilai (seperti tipe-tuple atau JSON atau serupa) dan Anda akan mengekstrak satu bidang sebagai kunci.

Lihat: http://kafka.apache.org/intro#intro_topics dan http://kafka.apache.org/intro#intro_producers

Secara umum, kunci dan / atau nilai juga bisa null. Jika kuncinya adalah nullpartisi acak akan dipilih. Jika nilai nullitu dapat memiliki khusus "delete" semantik dalam kasus Anda mengaktifkan log-pemadatan bukan kebijakan log-retensi untuk topik ( http://kafka.apache.org/documentation#compaction ).

Matthias J. Sax
sumber
2
Dan khususnya, kunci juga memainkan peran yang relevan dalam API streaming Kafka, dengan KStreamdan KTable- lihat di sini .
Reim
12
Kunci dapat digunakan untuk menentukan partisi, tetapi ini hanya strategi default produsen. Pada akhirnya, produsenlah yang memilih partisi mana yang akan digunakan.
gvo
@gvo Apakah kunci memiliki lebih banyak kegunaan?
leoconco
1
Ini dapat digunakan untuk menyimpan hanya satu contoh pesan per kunci, seperti yang disebutkan di tautan pemadatan log. Saya tidak tahu tentang kasus penggunaan lainnya.
gvo
2
Jika Anda menentukan partitionparameter , parameter itu akan digunakan, dan kuncinya akan "diabaikan" (atau tentu saja, kunci akan tetap ditulis ke dalam topik). - Ini memungkinkan Anda untuk memiliki partisi yang disesuaikan meskipun Anda memiliki kunci.
Matthias J. Sax
17

Tambahan yang terlambat ... Menentukan kunci sehingga semua pesan pada kunci yang sama pergi ke partisi yang sama sangat penting untuk pengurutan pemrosesan pesan yang tepat jika Anda akan memiliki banyak konsumen dalam satu grup konsumen pada suatu topik.

Tanpa kunci, dua pesan pada kunci yang sama dapat masuk ke partisi yang berbeda dan diproses oleh konsumen yang berbeda dalam grup yang rusak.

MikeK
sumber
-1

Kasus penggunaan menarik lainnya

Kita dapat menggunakan atribut key dalam topik Kafka untuk mengirim user_id dan kemudian dapat menghubungkan konsumen untuk mengambil acara streaming (peristiwa yang disimpan dalam atribut nilai). Ini dapat memungkinkan Anda memproses riwayat maksimal urutan peristiwa pengguna untuk membuat fitur dalam model pembelajaran mesin Anda.

Saya masih harus mencari tahu apakah ini mungkin atau tidak. Akan terus memperbarui jawaban saya dengan detail lebih lanjut.

Utkarsh Gupta
sumber