Kafka Konularını ve Bölümlerini Anlama


185

Kurumsal çözüm amaçlı Kafka öğrenmeye başlıyorum.

Okumalarım sırasında aklıma bazı sorular geldi:

  1. Bir üretici bir mesaj ürettiğinde - mesajı göndermek istediği konuyu belirleyecektir, doğru mu? Bölümleri önemsiyor mu?
  2. Bir abone çalışırken - aynı konunun tüketici kümesinin veya bu tüketici grubunun ilgilendiği birkaç konunun parçası olabilmesi için grup kimliğini belirtir mi?
  3. Her tüketici grubunun aracıda karşılık gelen bir bölümü var mı veya her bir tüketicinin bir bölümü var mı?

  4. Bölümler aracı tarafından oluşturulur ve bu nedenle tüketiciler için bir endişe kaynağı olmaz mı?

  5. Bu, her bölüm için ofseti olan bir kuyruk olduğundan, okumak istediği iletileri belirtmek tüketicinin sorumluluğunda mıdır? Durumunu kurtarması gerekiyor mu?

  6. Bir mesaj kuyruktan silindiğinde ne olur? - Örneğin: tutma 3 saat sürdü, sonra zaman geçti, ofset her iki tarafta nasıl ele alınıyor?

Yanıtlar:


162

Bu gönderinin zaten cevapları var, ancak Kafka Definitive Guide'dan birkaç fotoğrafla görüşümü ekliyorum

Her bir soruyu cevaplamadan önce, üretici bileşenlerine genel bir bakış ekleyelim:

üretici bileşenlerine genel bakış

1. Bir üretici bir mesaj ürettiğinde - Mesajı göndermek istediği konuyu belirleyecektir, doğru mu? Bölümleri önemsiyor mu?

Üretici, aşağıdakilere bağlı olarak herhangi bir mesaj yerleştirmek için hedef bölüme karar verecektir:

  • Mesajda belirtilmişse, bölüm kimliği
  • bölüm kimliği belirtilmemişse % num bölümlerini anahtarla
  • Mesajda ne bölüm kimliği ne de mesaj anahtarı mevcut ise, yalnızca değer kullanılabilir demektir.

2. Bir abone çalışırken - Aynı kimliğe sahip tüketici kümesinin veya bu tüketici grubunun ilgilendiği birkaç konunun parçası olabilmesi için grup kimliğini belirtir mi?

Basit atama API'sını kullanmadığınız ve ofsetleri Kafka'da depolamanız gerekmediği sürece group.id dosyasını her zaman yapılandırmalısınız . Hiçbir grubun parçası olmayacak. kaynak

3. Her tüketici grubunun aracıda karşılık gelen bir bölümü var mı veya her tüketicinin bir bölümü var mı?

Bir tüketici grubunda, her bölüm yalnızca bir tüketici tarafından işlenir . Bunlar olası senaryolar

  • Tüketici sayısı konu bölümü sayısından az ise gruptaki tüketicilerden birine birden çok bölüm atanabilir konu bölümlerinden daha az tüketici sayısı
  • Aynı tüketici sayısıKonu bölümü sayısı ile sayısı, daha sonra bölüm ve tüketici eşlemesi aşağıdaki gibi olabilir, konu bölümü sayısı ile aynı tüketici sayısı
  • Tüketici sayısı konu bölümü sayısından daha fazla , daha sonra bölüm ve tüketici eşlemesi aşağıda görüldüğü gibi olabilir, Etkili değil, kontrol edin Tüketici 5 konu bölümü sayısından fazla tüketici sayısı

4. Aracı tarafından oluşturulan bölümler, bu nedenle tüketiciler için bir endişe değil mi?

Tüketici , 3. soruda tartışıldığı gibi bölüm sayısının farkında olmalıdır .

5. Bu, her bölüm için ofseti olan bir kuyruk olduğundan, okumak istediği iletileri belirtmek tüketicinin sorumluluğunda mıdır? Durumunu kurtarması gerekiyor mu?

Kafka (spesifik olarak Grup Koordinatörü ), bir iç bir mesaj üreterek ofset devlet ilgilenir __consumer_offsets konu, bu davranış kılavuzu için yapılandırılabilir yanı tarafından ayarı olabilir enable.auto.commitiçin false. Bu durumda consumer.commitSync()ve consumer.commitAsync()ofseti yönetmek için yardımcı olabilir.

Grup Koordinatörü hakkında daha fazla bilgi :

  1. Kafka sunucusu tarafından kümede seçilen brokerlerden biri.
  2. Tüketiciler, ofset taahhütleri ve getirme talepleri için Grup Koordinatörü ile etkileşime girer.
  3. Tüketici, Grup Koordinatörüne periyodik kalp atışı gönderir.

6. Bir mesaj kuyruktan silindiğinde ne olur? - Örneğin: Tutma 3 saat sürdü, sonra zaman geçti, ofset her iki tarafta da nasıl ele alınıyor?

Herhangi bir tüketici saklama döneminden sonra başlarsa, auto.offset.resetolabilecek yapılandırma başına mesajlar tüketilir latest/earliest. teknik olarak latest(yeni iletileri işlemeye başlayın) çünkü o zamana kadar tüm iletilerin süresi dolmuş ve elde tutma konu düzeyinde yapılandırmadır.


5
Selam ! Kabul edilen cevabın yazarıyım, ama sizinkilerin de gerçekten güzel olduğunu düşünüyorum, özellikle diyagramların şeyleri% 200 daha netleştirdiği 3. noktada! Sence birleştirmeliyiz?
C4stor

Daha fazla görünürlük elde etmek ve (şu anda) bu üst cevabı geliştirmek için cevabınızın unsurlarını benimkine dahil edebileceğimi kastetmiştim. Ama bunu senin anlaşman olmadan yapmazdım!
C4stor

Çoklu tüketiciyi neden bir bölümle eşleyemiyorsunuz? Mesajın sadece bir kez işlenmesini sağlamak için? Cevabınız için teşekkürler.
g10guang

1
@ g10guang: Bunun nedeni, ofset bakımdaki zorluklardan kaynaklanıyor .
mrsrinivas

1
Başka bir senaryo. BİR bölümün ve MULTIPLE tüketicinin abone olmasını / atanmasını sağlayabilirsiniz. Aracı, kayıtları yalnızca ilk kayıtlı tüketiciye teslim edecektir. Ancak diyelim ki ilk tüketici anketi işlemek için anketten daha fazla zaman alıyor. Kayıt tüketimi aracıya bağlı değil. Aracı, tüketicinin takıldığını anlıyor. Bu durumda, aracı yeni atanan bölümleri tüm tüketicilerine gönderen bir yeniden dengelemeyi tetikler. İleti, C1 tarafından işlenmesine rağmen başka bir tüketici tarafından tekrar tüketilir. Dikkatli ol.
Ruben Daddario

127

Bunları sırayla alalım :)

1 - Bir üretici bir mesaj ürettiğinde - Mesajı göndermek istediği konuyu belirleyecektir, doğru mu? Bölümleri önemsiyor mu?

Varsayılan olarak, üretici bölümlemeyi önemsemez. Daha iyi bir kontrole sahip olmak için özelleştirilmiş bir bölümleyici kullanma seçeneğiniz vardır, ancak tamamen isteğe bağlıdır.


2 - Bir abone çalışırken - Aynı kimliğin tüketici kümesinin veya bu tüketici grubunun ilgilendiği birkaç konunun parçası olabilmesi için grup kimliğini belirtir mi?

Evet, tüketiciler yükü paylaşmak için bir tüketici grubuna katılır (ya da yalnızlarsa yaratır). Aynı gruptaki hiçbir tüketici aynı mesajı alamayacak.


3 - Her tüketici grubunun aracıda karşılık gelen bir bölümü var mı veya her bir tüketicinin bir bölümü var mı?

Ne. Bir tüketici grubundaki tüm tüketicilere iki koşul altında bir dizi bölüm atanır: aynı gruptaki hiçbir iki tüketicinin ortak bir bölümü yoktur - ve bir bütün olarak tüketici grubuna mevcut her bölüme atanır.


4 - Bölmeler aracı tarafından yaratıldı, bu nedenle tüketiciler için bir endişe değil mi?

Öyle değiller, ancak 3'ten mevcut bölümlerden daha fazla tüketiciye sahip olmanın tamamen işe yaramaz olduğunu görebilirsiniz, bu nedenle tüketmek için maksimum paralellik seviyeniz.


5 - Bu, her bölüm için ofseti olan bir kuyruk olduğundan, okumak istediği iletileri belirtmek tüketicinin sorumluluğunda mıdır? Durumunu kurtarması gerekiyor mu?

Evet, tüketiciler bölüm başına konu başına bir denge kaydeder. Bu tamamen Kafka tarafından halledilir, endişelenmeyin.


6 - Bir mesaj kuyruktan silindiğinde ne olur? - Örneğin: Tutma 3 saat sürdü, sonra zaman geçti, ofset her iki tarafta nasıl ele alınıyor?

Bir tüketici, aracılar üzerindeki bir bölüm için uygun olmayan bir ofset isterse (örneğin, silme nedeniyle), bir hata moduna girer ve sonuçta bu bölüm için kendisini en son veya en eski iletiye sıfırlar ( auto.offset.reset yapılandırma değeri) ve çalışmaya devam edin.


3
Sry :) 500 karakterlik kutularda tüm kafka sürecini açıklamak biraz zor, kafka.apache.org/documentation.html#theconsumer'ı (ve muhtemelen 4. bölümün geri kalanında kafka iç kısımları hakkında) okumanızı öneririm . Temel olarak: tüketiciler tasarruf ofsetleri talep eder , ancak bunlar başka bir yere kaydedilir.
C4stor

Bunu sadece okudum ve hala nerede tutulduğu açıklanmıyor: Kafka bunu farklı şekilde ele alıyor. Başlığımız, her biri belirli bir zamanda bir tüketici tarafından tüketilen tamamen sipariş edilmiş bir dizi bölüme ayrılmıştır. Bu, her bölümdeki bir tüketicinin konumunun yalnızca tek bir tamsayı olduğu, tüketilecek bir sonraki iletinin ofseti olduğu anlamına gelir. Bu, tüketilen şeyle ilgili durumu, her bölüm için sadece bir sayı yapar. Bu durum periyodik olarak kontrol edilebilir. Bu, ileti bildirimlerinin eşdeğerini çok ucuz hale getirir.
Pinidbest

20

Kafka, mesaj akışına düzen getirmek için gelen Konu anlayışını kullanır .

Yükü dengelemek için, bir konu birden fazla bölüme ayrılabilir ve aracılar arasında çoğaltılabilir.

Bölümler sıralanmıştır, sürekli olarak eklenen mesajların değişmez dizileri yani bir kayıt günlüğüdür.

Bölümdeki iletiler, bölümdeki her iletiyi benzersiz şekilde tanımlayan sıralı bir kimlik numarasına sahiptir.

Bölümler, bir konunun günlüğünün tek bir sunucuya (aracıya) sığacak bir boyutun ötesine ölçeklenmesine ve paralellik birimi olarak davranmasına izin verir.

Bir konunun bölümleri, her bir aracının verileri işlediği ve bölümlerin paylaşımını istediği Kafka kümesindeki aracılara dağıtılır.

Her bölüm, hata toleransını sağlamak için yapılandırılabilir sayıda aracıda çoğaltılır.

Bu makalede iyi açıklanmıştır: http://codeflex.co/what-is-apache-kafka/


Bölüm yalnızca konu yük dengesi için mi?
g10guang

1
@ g10guang: bölümler mesajları paralel olarak işlemeye de yardımcı olur.
mrsrinivas

Lütfen yanılıyorsam beni düzeltin, bir üretici tarafından gönderilen bir mesaj olduğunda ve konuya geldiğinde, konfigürasyonlara göre bölümlere kopyalar ve tüketici bunu tüketir. Sağ?
Atul

1
@Ama geçerli Bölümleme yapılandırmasına göre bu Konu için bölümlerin 1'ine eklenecektir (varsayılan olarak mesaj tuşunun karması mesajın hangi bölüme gideceğini belirler) ve evet, bir Tüketici mesajı bu bölümden mesajlar tüketir
Kevin Hooke

@Kevin Hooke, açıklama ve anlayışımı sildiğiniz için teşekkürler.
Atul
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.