Apa yang menentukan offset konsumen Kafka?

170

Saya relatif baru di Kafka. Saya telah melakukan sedikit percobaan dengan itu, tetapi beberapa hal tidak jelas bagi saya mengenai penggantian konsumen. Dari apa yang saya pahami sejauh ini, ketika konsumen mulai, offset yang akan mulai dibaca ditentukan oleh pengaturan konfigurasi auto.offset.reset(koreksi saya jika saya salah).

Sekarang katakan misalnya ada 10 pesan (offset 0 hingga 9) dalam topik, dan seorang konsumen mengkonsumsi 5 dari mereka sebelum turun (atau sebelum saya membunuh konsumen). Lalu katakan saya memulai kembali proses konsumen itu. Pertanyaan saya adalah:

  1. Jika auto.offset.resetdiset ke smallest, apakah selalu akan mulai mengkonsumsi dari offset 0?

  2. Jika auto.offset.resetdiatur ke largest, apakah akan mulai mengkonsumsi dari offset 5?

  3. Apakah perilaku mengenai skenario semacam ini selalu deterministik?

Tolong jangan ragu untuk berkomentar jika ada pertanyaan saya yang tidak jelas. Terima kasih sebelumnya.

Asif Iqbal
sumber

Jawaban:

260

Ini sedikit lebih kompleks daripada yang Anda gambarkan.
The auto.offset.resetconfig tendangan HANYA jika kelompok konsumen Anda tidak memiliki diimbangi tempat berkomitmen berlaku (2 didukung penyimpanan diimbangi sekarang adalah Kafka dan Zookeeper), dan juga tergantung pada jenis konsumen yang Anda gunakan.

Jika Anda menggunakan konsumen java tingkat tinggi maka bayangkan skenario berikut:

  1. Anda memiliki konsumen dalam grup konsumen group1yang telah mengkonsumsi 5 pesan dan meninggal. Lain kali Anda memulai konsumen ini bahkan tidak akan menggunakan auto.offset.resetkonfigurasi itu dan akan melanjutkan dari tempat ia mati karena hanya akan mengambil offset tersimpan dari penyimpanan offset (Kafka atau ZK seperti yang saya sebutkan).

  2. Anda memiliki pesan dalam suatu topik (seperti yang Anda jelaskan) dan Anda memulai konsumen dalam grup konsumen baru group2. Tidak ada offset yang disimpan di mana pun dan kali ini auto.offset.resetkonfigurasi akan memutuskan apakah akan memulai dari awal topik ( earliest) atau dari akhir topik ( latest)

Satu hal lagi yang mempengaruhi nilai offset yang akan sesuai dengan earliestdan latestkonfigurasi adalah kebijakan penyimpanan log. Bayangkan Anda memiliki topik dengan retensi yang dikonfigurasi hingga 1 jam. Anda menghasilkan 5 pesan, dan kemudian satu jam kemudian Anda memposting 5 pesan lagi. The latestdiimbangi masih akan tetap sama seperti pada contoh sebelumnya tapi earliestsatu tidak akan bisa menjadi 0karena Kafka sudah akan menghapus pesan-pesan ini dan dengan demikian awal yang tersedia diimbangi akan 5.

Segala sesuatu yang disebutkan di atas tidak terkait dengan SimpleConsumerdan setiap kali Anda menjalankannya, itu akan memutuskan di mana mulai dari menggunakan auto.offset.resetkonfigurasi.

Jika Anda menggunakan versi Kafka lebih tua dari 0,9, Anda harus mengganti earliest, latestdengan smallest, largest.

serejja
sumber
3
Terima kasih banyak atas jawabannya. Jadi untuk konsumen tingkat tinggi, begitu konsumen memiliki sesuatu yang dilakukan (baik dalam ZK atau Kafka), auto.offset.resettidak ada artinya setelah itu? Satu-satunya signifikansi pengaturan itu adalah ketika tidak ada yang dilakukan (dan idealnya itu akan menjadi pada saat pertama kali memulai konsumen)?
Asif Iqbal
2
Persis seperti yang Anda jelaskan
serejja
1
@serejja Halo - bagaimana jika saya selalu memiliki 1 konsumen per grup, dan skenario # 1 dari jawaban Anda muncul untuk saya? Apakah akan sama?
ha9u63ar
1
@ ha9u63ar tidak begitu mengerti pertanyaan Anda. Jika Anda me-restart konsumen Anda di grup yang sama maka ya, itu tidak akan menggunakan auto.offset.resetdan melanjutkan dari offset yang dilakukan. Jika Anda selalu menggunakan grup konsumen yang berbeda (seperti menghasilkannya ketika memulai konsumen), maka konsumen akan selalu menghormatiauto.offset.reset
serejja
@serejja ya dan itu tidak berhasil untuk saya. bisa tolong lihat ini - ini adalah masalah saya
ha9u63ar
83

Hanya pembaruan: Dari Kafka 0.9 dan seterusnya, Kafka menggunakan versi Java baru dari konsumen dan nama parameter auto.offset.reset telah berubah; Dari manual:

Apa yang harus dilakukan ketika tidak ada offset awal di Kafka atau jika offset saat ini tidak ada lagi di server (mis. Karena data tersebut telah dihapus):

paling awal : secara otomatis mengatur ulang offset ke offset paling awal

latest : secara otomatis mereset offset ke offset terbaru

tidak ada : lempar pengecualian ke konsumen jika tidak ada offset sebelumnya yang ditemukan untuk kelompok konsumen

hal lain: berikan pengecualian kepada konsumen.

Saya meluangkan waktu untuk menemukan ini setelah memeriksa jawaban yang diterima, jadi saya pikir mungkin bermanfaat bagi komunitas untuk mempostingnya.

Seng Israel
sumber
9

Lebih jauh lagi ada offsets.retention.minutes. Jika waktu sejak komit terakhir> offsets.retention.minutes, maka auto.offset.resettendangan juga

Sasa Ninkovic
sumber
1
Bukankah ini tampak berlebihan dengan retensi log? Haruskah retensi ofset didasarkan pada retensi log?
mike01010
@ mike01010 itu benar. Itu harus didasarkan pada retensi log, itu salah satu solusi yang diusulkan dalam tiket. Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. issues.apache.org/jira/browse/KAFKA-3806
saheb
Jawaban itu membuatku takut untuk sementara waktu, sampai aku memeriksa dokumentasi dari offsets.retention.minutes: <b> Setelah grup konsumen kehilangan semua konsumennya (yaitu menjadi kosong) offsetnya akan disimpan untuk periode retensi ini sebelum dibuang. </b> Untuk standalone konsumen (menggunakan penugasan manual), offset akan kedaluwarsa setelah waktu komit terakhir ditambah periode retensi ini. (Ini untuk Kafka 2.3)
jumping_monkey