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:
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 sama dengan jumlah partisi topik, lalu pemetaan partisi dan konsumen bisa seperti di bawah ini,
- 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
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.commit
ke false
. Dalam hal itu consumer.commitSync()
danconsumer.commitAsync()
dapat membantu mengelola offset.
Lebih lanjut tentang Koordinator Grup :
- Ini adalah salah satu broker terpilih di cluster dari sisi server Kafka.
- Konsumen berinteraksi dengan Koordinator Grup untuk komitmen offset dan pengambilan permintaan.
- 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.reset
konfigurasi 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.
Mari kita bereskan :)
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.
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.
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.
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.
Ya, konsumen menyimpan offset per topik per partisi. Ini sepenuhnya ditangani oleh Kafka, jangan khawatir tentang itu.
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.
sumber
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/
sumber