Memahami Topik dan Partisi Kafka

185

Saya mulai belajar Kafka untuk tujuan solusi perusahaan.

Selama pembacaan saya, beberapa pertanyaan muncul di benak saya:

  1. Ketika seorang produser memproduksi pesan - itu akan menentukan topik yang ingin dikirimi pesan, apakah itu benar? Apakah itu peduli dengan partisi?
  2. Ketika pelanggan berjalan - apakah ia menentukan id grupnya sehingga bisa menjadi bagian dari sekelompok konsumen dari topik yang sama, atau beberapa topik yang diminati oleh kelompok konsumen ini?
  3. Apakah setiap kelompok konsumen memiliki partisi yang sesuai pada broker atau apakah masing-masing konsumen memiliki partisi?

  4. Apakah partisi dibuat oleh broker, dan karenanya tidak menjadi perhatian bagi konsumen?

  5. Karena ini adalah antrian dengan offset untuk setiap partisi, apakah merupakan tanggung jawab konsumen untuk menentukan pesan mana yang ingin dibaca? Apakah perlu menyelamatkan kondisinya?

  6. Apa yang terjadi ketika pesan dihapus dari antrian? - Misalnya: retensi selama 3 jam, lalu waktu berlalu, bagaimana offset ditangani di kedua sisi?

Pinidbest
sumber

Jawaban:

162

Posting ini sudah memiliki jawaban, tetapi saya menambahkan pandangan saya dengan beberapa gambar dari Kafka Definitive Guide

Sebelum menjawab setiap pertanyaan, mari tambahkan ikhtisar komponen produsen:

gambaran umum komponen produsen

1. Ketika seorang produser memproduksi pesan - Ini akan menentukan topik yang ingin dikirimi pesan, apakah itu benar? Apakah itu peduli dengan partisi?

Produser akan memutuskan partisi target untuk menempatkan pesan apa pun, tergantung pada:

  • Id partisi, jika ditentukan dalam pesan
  • key% num partisi , jika tidak ada id partisi yang disebutkan
  • Round robin jika id partisi atau kunci pesan tidak tersedia di pesan, artinya hanya nilai yang tersedia

2. Ketika pelanggan berjalan - Apakah ia menentukan id grupnya sehingga dapat menjadi bagian dari sekelompok konsumen dari topik yang sama atau beberapa topik yang diminati oleh kelompok konsumen ini?

Anda harus selalu mengonfigurasi group.id kecuali Anda menggunakan API penugasan sederhana dan Anda tidak perlu menyimpan offset di Kafka. Itu tidak akan menjadi bagian dari grup mana pun. sumber

3. Apakah setiap kelompok konsumen memiliki partisi yang sesuai pada broker atau apakah masing-masing konsumen memiliki partisi?

Dalam satu grup konsumen, setiap partisi akan diproses oleh satu konsumen saja . Ini adalah beberapa skenario yang mungkin

  • Jumlah konsumen kurang dari jumlah partisi topik kemudian beberapa partisi dapat ditugaskan ke salah satu konsumen dalam grup jumlah konsumen kurang dari partisi topik
  • Jumlah konsumen sama dengan jumlah partisi topik, lalu pemetaan partisi dan konsumen bisa seperti di bawah ini, jumlah konsumen sama dengan jumlah partisi topik
  • Jumlah konsumen lebih tinggi dari jumlah partisi topik, maka partisi dan pemetaan konsumen dapat seperti yang terlihat di bawah ini, Tidak efektif, periksa Konsumen 5 jumlah konsumen lebih dari jumlah partisi topik

4. Sebagai partisi yang dibuat oleh broker, oleh karena itu tidak menjadi perhatian bagi konsumen?

Konsumen harus mengetahui jumlah partisi, seperti yang dibahas dalam pertanyaan 3.

5. Karena ini adalah antrian dengan offset untuk setiap partisi, apakah merupakan tanggung jawab konsumen untuk menentukan pesan mana yang ingin dibaca? Apakah perlu menyelamatkan kondisinya?

Kafka (untuk menjadi Koordinator Grup spesifik ) menangani keadaan offset dengan menghasilkan pesan ke topik __consumer_offsets internal , perilaku ini dapat dikonfigurasi untuk manual juga dengan mengatur enable.auto.commitke false. Dalam hal itu consumer.commitSync()danconsumer.commitAsync() dapat membantu mengelola offset.

Lebih lanjut tentang Koordinator Grup :

  1. Ini adalah salah satu broker terpilih di cluster dari sisi server Kafka.
  2. Konsumen berinteraksi dengan Koordinator Grup untuk komitmen offset dan pengambilan permintaan.
  3. Konsumen mengirimkan detak jantung berkala ke Koordinator Grup.

6. Apa yang terjadi ketika pesan dihapus dari antrian? - Misalnya: Retensi selama 3 jam, lalu waktu berlalu, bagaimana offset ditangani di kedua sisi?

Jika ada konsumen yang memulai setelah periode penyimpanan, pesan akan dikonsumsi sesuai auto.offset.resetkonfigurasi yang mungkin latest/earliest. secara teknis itu latest(mulai memproses pesan baru) karena semua pesan kadaluwarsa pada saat itu dan penyimpanan adalah konfigurasi tingkat topik.

mrsrinivas
sumber
5
Hai! Saya adalah penulis jawaban yang diterima, tetapi saya pikir jawaban Anda juga sangat bagus, terutama pada poin nomor 3 di mana diagram membuat segalanya lebih jelas 200%! Apakah Anda pikir kita harus bergabung?
C4stor
Maksud saya, saya (atau Anda) dapat memasukkan unsur-unsur jawaban Anda di tambang, untuk membuatnya lebih terlihat dan meningkatkan ini (saat ini) jawaban teratas. Tapi aku tidak akan melakukannya tanpa persetujuanmu!
C4stor
Mengapa tidak bisa memetakan multi konsumen ke partisi? Untuk memastikan pesan cukup proses sekali saja? Terima kasih atas jawaban Anda.
g10guang
1
@ g10guang: Itu karena kesulitan dalam melakukan pemeliharaan offset .
mrsrinivas
1
Skenario lain. Anda dapat memiliki satu partisi dan beberapa pelanggan berlangganan / ditugaskan untuk itu. Pialang akan mengirimkan catatan hanya kepada konsumen terdaftar pertama. Tapi mari kita anggap konsumen pertama membutuhkan lebih banyak waktu untuk memproses tugas daripada interval jajak pendapat. Konsumsi rekor tidak berkomitmen untuk broker. Pialang mengerti bahwa konsumen nongkrong. Dalam keadaan ini, broker memicu penyeimbangan ulang mengirimkan partisi yang ditugaskan baru untuk semua konsumennya. Pesan tersebut dikonsumsi lagi oleh konsumen lain meskipun masih diproses oleh C1. Hati-hati.
Ruben Daddario
127

Mari kita bereskan :)

1 - Ketika seorang produser memproduksi pesan - Ini akan menentukan topik yang ingin dikirimi pesannya, benarkah itu? Apakah itu peduli dengan partisi?

Secara default, produsen tidak peduli tentang partisi. Anda memiliki opsi untuk menggunakan partisi yang disesuaikan untuk memiliki kontrol yang lebih baik, tetapi itu sepenuhnya opsional.


2 - Ketika pelanggan berjalan - Apakah ia menentukan id grupnya sehingga dapat menjadi bagian dari sekelompok konsumen dari topik yang sama atau beberapa topik yang diminati oleh kelompok konsumen ini?

Ya, konsumen bergabung (atau membuat jika mereka sendirian) kelompok konsumen untuk berbagi muatan. Tidak ada dua konsumen dalam kelompok yang sama yang akan menerima pesan yang sama.


3 - Apakah setiap kelompok konsumen memiliki partisi yang sesuai pada broker atau apakah masing-masing konsumen memiliki partisi?

Tidak juga. Semua konsumen dalam grup konsumen diberi sekumpulan partisi, dengan dua syarat: tidak ada dua konsumen dalam grup yang sama yang memiliki partisi yang sama - dan grup konsumen secara keseluruhan ditugaskan untuk setiap partisi yang ada.


4 - Apakah partisi dibuat oleh broker, karena itu tidak menjadi perhatian bagi konsumen?

Mereka tidak, tetapi Anda dapat melihat dari 3 bahwa sama sekali tidak berguna untuk memiliki lebih banyak konsumen daripada partisi yang ada, sehingga tingkat paralelisme maksimum Anda untuk mengkonsumsi.


5 - Karena ini adalah antrian dengan offset untuk setiap partisi, apakah merupakan tanggung jawab konsumen untuk menentukan pesan mana yang ingin dibaca? Apakah perlu menyelamatkan kondisinya?

Ya, konsumen menyimpan offset per topik per partisi. Ini sepenuhnya ditangani oleh Kafka, jangan khawatir tentang itu.


6 - Apa yang terjadi ketika pesan dihapus dari antrian? - Misalnya: Retensi selama 3 jam, lalu waktu berlalu, bagaimana offset ditangani di kedua sisi?

Jika seorang konsumen pernah meminta offset tidak tersedia untuk partisi di broker (misalnya, karena penghapusan), ia memasuki mode kesalahan, dan akhirnya mengatur ulang sendiri untuk partisi ini ke pesan terbaru atau terlama yang tersedia (tergantung pada nilai konfigurasi auto.offset.reset), dan terus bekerja.

C4stor
sumber
3
Sry :) Agak sulit menjelaskan keseluruhan proses kafka dalam 500 kotak karakter, saya sarankan membaca kafka.apache.org/documentation.html#theconsumer (dan mungkin sisa bagian 4, tentang internal kafka). Pada dasarnya: konsumen meminta penyeimbangan, tetapi itu disimpan di tempat lain.
C4stor
Saya baru saja membaca ini dan masih ini tidak menjelaskan di mana ia disimpan: Kafka menangani ini secara berbeda. Topik kita dibagi menjadi sekumpulan partisi yang dipesan sepenuhnya, yang masing-masing dikonsumsi oleh satu konsumen pada waktu tertentu. Ini berarti bahwa posisi konsumen di setiap partisi hanyalah bilangan bulat tunggal, offset dari pesan berikutnya untuk dikonsumsi. Ini membuat keadaan tentang apa yang telah dikonsumsi sangat kecil, hanya satu angka untuk setiap partisi. Keadaan ini dapat diperiksa secara berkala. Ini membuat pesan yang setara dengan ucapan terima kasih menjadi sangat murah.
Pinidbest
20

Kafka menggunakan konsepsi Topik yang datang untuk mengatur aliran pesan.

Untuk menyeimbangkan beban, suatu topik dapat dibagi menjadi beberapa partisi dan direplikasi di seluruh broker.

Partisi diurutkan, urutan pesan yang berubah yang terus menerus ditambahkan yaitu log komit.

Pesan di partisi memiliki nomor id berurutan yang secara unik mengidentifikasi setiap pesan di dalam partisi.

Partisi memungkinkan log topik untuk melampaui ukuran yang sesuai pada satu server (broker) dan bertindak sebagai unit paralelisme.

Partisi dari suatu topik didistribusikan melalui broker di cluster Kafka di mana setiap broker menangani data dan permintaan untuk bagian dari partisi.

Setiap partisi direplikasi di sejumlah broker yang dapat dikonfigurasi untuk memastikan toleransi kesalahan.

Dijelaskan dengan baik dalam artikel ini: http://codeflex.co/what-is-apache-kafka/

ybonda
sumber
Apakah Partisi hanya untuk keseimbangan beban topik?
g10guang
1
@ g10guang: partisi juga membantu memproses pesan secara paralel.
mrsrinivas
Harap perbaiki saya jika saya salah, ketika pesan dikirim oleh produser dan ketika ada topik, ia akan menyalinnya ke partisi sesuai konfigurasi dan kemudian konsumen mengkonsumsinya. Baik?
Atul
1
@Atul pesan akan ditambahkan ke 1 dari partisi untuk Topik itu sesuai dengan konfigurasi Pemisah saat ini (secara default hash tombol pesan menentukan partisi mana yang digunakan untuk pesan), dan ya, seorang Konsumen akan mengambil pesan sebagai itu mengkonsumsi pesan dari partisi itu
Kevin Hooke
@Kevin Hooke, terima kasih atas penjelasan dan untuk menjernihkan pemahaman saya.
Atul