Kafka tüketici ofsetini ne belirler?


170

Kafka için nispeten yeniyim. Ben biraz denemek yaptım, ama tüketici telafisi ile ilgili birkaç şey benim için belirsiz. Şimdiye kadar anladığım kadarıyla, bir tüketici başladığında, okumaya başlayacağı ofset, yapılandırma ayarı tarafından belirlenir auto.offset.reset(yanlışsam beni düzeltin).

Şimdi örneğin, konuyla ilgili 10 mesaj olduğunu (0 ila 9 ofseti) olduğunu ve bir tüketicinin 5 tanesini, gitmeden önce (veya tüketiciyi öldürmeden önce) tükettiğini söyleyin. O zaman bu tüketici sürecini yeniden başlattığımı söyleyin. Sorularım:

  1. Olarak auto.offset.resetayarlanırsa smallest, her zaman 0 ofsetinden tüketmeye başlayacak mı?

  2. Olarak auto.offset.resetayarlanırsa largest, ofset 5'ten tüketmeye başlayacak mı?

  3. Bu tür bir senaryoya ilişkin davranış her zaman belirleyici midir?

Sorumdaki herhangi bir şey net değilse lütfen yorum yapmaktan çekinmeyin. Şimdiden teşekkürler.

Yanıtlar:


260

Açıkladığınızdan biraz daha karmaşık. Tüketici grubunun geçerli bir ofset taahhüt bir yere sahip değildir SADECE eğer config tekmeler (2 desteklenen ofset depoların şimdi Kafka ve hayvan bakıcısı olan) ve aynı zamanda çeşit tüketicinin kullandığınız bağlıdır.
auto.offset.reset

Üst düzey bir java tüketicisi kullanıyorsanız, aşağıdaki senaryoları hayal edin:

  1. Tüketici grubunda group15 mesaj tüketen ve ölen bir tüketiciniz var. Bir dahaki sefere bu tüketiciyi başlattığınızda, bu auto.offset.resetyapılandırmayı kullanmaz ve öldüğü yerden devam eder, çünkü depolanan ofseti ofset depodan alır (bahsettiğim gibi Kafka veya ZK).

  2. Bir konuda (açıkladığınız gibi) mesajlarınız var ve yeni bir tüketici grubunda bir tüketici başlatıyorsunuz group2. Hiçbir yerde saklanır dengeleniyor ve bu kez auto.offset.resetyapılandırma konu (başından başlamak karar verecek earliest() veya konunun ucundan latest)

Hangi ofset değerinin karşılık geleceğini earliestve latestyapılandırılacağını etkileyen bir başka şey de günlük tutma ilkesidir. Saklama süresi 1 saat olarak belirlenmiş bir konunuz olduğunu düşünün. 5 mesaj üretiyorsunuz ve bir saat sonra 5 mesaj daha gönderiyorsunuz. latestHala önceki örnekte olduğu gibi aynı kalacak ofset ama earliestbiri olmak mümkün olmayacaktır 0Kafka zaten olacak ofset bu mesajları ve böylece erken mevcut kaldıracak çünkü 5.

Yukarıda belirtilen her şey ilgili değildir SimpleConsumerve her çalıştırdığınızda, auto.offset.resetconfig'i nereden başlatacağınıza karar verecektir .

Eğer 0.9 den Kafka versiyonu eski kullanıyorsanız, değiştirmek zorunda earliest, latestile smallest, largest.


3
Cevabınız için çok teşekkürler. Üst düzey tüketiciye gelince, bir kez tüketicinin (ZK veya Kafka'da) bir şeyi taahhüt ettikten sonra auto.offset.reset, bunun bir önemi yoktur? Bu ortamın tek önemi, taahhüt edilen hiçbir şey olmadığı (ve ideal olarak tüketicinin ilk açılışında olacağı)?
Asif Iqbal

2
Tam olarak tarif ettiğiniz gibi
serejja

1
@serejja Merhaba - her zaman grup başına 1 tüketici varsa ve cevabınızın # 1 senaryosu benim için olursa ne olur? Aynı olur mu?
ha9u63ar

1
@ ha9u63ar sorunuzu tam olarak anlamadı. Tüketicinizi aynı grupta yeniden başlatırsanız evet, auto.offset.resettaahhüt edilen ofseti kullanmayacak ve kullanmaya devam edecektir. Her zaman farklı bir tüketici grubu kullanırsanız (tüketiciyi başlatırken üretmek gibi), o zaman tüketici her zaman saygı auto.offset.reset
duyar

@serejja evet ve bu benim için çalışmıyor. Eğer bir göz atın lütfen olabilir bu - bu benim sorunum
ha9u63ar

83

Sadece bir güncelleme: Kafka 0.9 ve sonrasında, Kafka tüketicinin yeni bir Java sürümünü kullanıyor ve auto.offset.reset parametre adları değişti; Kılavuzdan:

Kafka'da başlangıç ​​ofseti olmadığında veya geçerli ofset sunucuda artık yoksa (örn. Bu veriler silindiğinden) ne yapmalı:

en erken : ofseti otomatik olarak en erken ofsete sıfırlar

latest : ofseti otomatik olarak en son ofsete sıfırla

none : Tüketici grubu için önceden bir ofset bulunmazsa, tüketiciye istisna at

başka bir şey: tüketiciye istisna atmak.

Kabul edilen cevabı kontrol ettikten sonra bunu bulmak için biraz zaman harcadım, bu yüzden topluluğun göndermesinin yararlı olabileceğini düşündüm.


9

Dahası, ofsetler.retention.minutes var. Geçen beri zaman işlemek ise> offsets.retention.minutes, daha sonra auto.offset.resetda tekmeler içinde


1
bu günlük tutma ile gereksiz görünmüyor mu? alıkoyma işlemi günlük tutma özelliğine dayanmalı mıdır?
mike01010

@ mike01010 bu doğru. Günlük tutma özelliğine dayanmalıdır, bu bilette önerilen çözümlerden biridir. Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. issue.apache.org/jira/browse/KAFKA-3806
saheb

Bu cevap i kontrol edene kadar, bir süre beni korkuttu belgelere ait offsets.retention.minutes. Bir müşteri grubu tüm tüketiciler (yani boş olur) kendi uzaklıklar atılan alma önce bu saklama süresi boyunca tutulacaktır kaybeder sonra <b> </ b> Bağımsız İçin tüketiciler (manuel atama kullanarak), ofsetlerin süresi son taahhüt tarihinden ve bu saklama süresinden sonra dolar. ( Kafka 2.3
Şunun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.