Kafka — Partition, Consumer Group ve Lag
30 saniyede özet
Kafka'da bir konu, kasalara benzeyen bölümlere (partition) ayrılır ve kaç kasa varsa o kadar iş aynı anda yapılır. Kasadan fazla kasiyer eklemek hızlandırmaz, fazlası boş bekler.
Kafka’yı bir kuyruk sanmak çok doğal ama yanlış. Kafka, sayfaları hiç yırtılmayan ve birkaç bölüme ayrılmış bir kayıt defteridir: mesaj okununca değil, saklama süresi dolunca silinir.
-
Bayt: Mesajlar birikiyor! Okuyucu sayısını ikiye katladım.
-
Sen: Birikme durdu mu?
-
Bayt: Yeni okuyucuların yarısı hiçbir şey yapmadan bekliyor...
-
Bayt: Dört kasalı bir markete altı kasiyer koyarsan ne olur?
Adım adım oku
- Dört partition'ı iki consumer okuyor; üretim tüketimden hızlı olduğu için bekleyen mesajlar (lag) birikiyor.
- Consumer sayısı partition sayısına çıkınca her kasaya bir kasiyer düşer ve birikme erir.
- Partition sayısından fazla consumer eklemek hızlandırmaz; fazladan gelenler boşta bekler.
- Aynı anahtarlı mesajlar hep aynı partition'a gider; bu yüzden birbirlerine göre sıraları korunur.
Partition: her şeyin merkezi
Bir topic, N adet partitionBir Kafka topic'inin, mesajların sırayla eklendiği ve ayrı ayrı tüketilebilen bölümlerinden biri.Hem paralelliğin hem sıralamanın birimi budur: paralellik partition sayısıyla sınırlı, sıralama yalnızca partition içinde garanti. İkisi aynı şeye bağlı olduğu için birbiriyle yarışır.Sözlükte gör →’dan oluşur. Her partition bağımsız, sıralı, append-only bir log’dur ve her mesajın o log içinde bir offset’i vardır.
Üç kritik sonuç:
- Sıralama yalnızca partition içindedir. Topic genelinde sıralama diye bir şey yoktur.
- Paralellik tavanı partition sayısıdır. Bir consumer group’ta bir partition’ı aynı anda yalnızca bir consumer okuyabilir.
- Partition sayısını artırmak kolay, azaltmak imkânsızdır. Ve artırmak, anahtarların dağılımını bozar.
Kafam karıştı, daha basit anlat
Topic bir süpermarketse, partition’lar onun kasalarıdır. Her kasada sıra korunur. Bir kasaya aynı anda yalnızca bir kasiyer bakar, bu yüzden kasadan fazla kasiyer boşta bekler.
Kendin gör
Varsayılan ayarda 4 partition, 2 consumer var ve üretim tüketimden hızlı — lagÜretilen ile tüketilen offset arasındaki fark. Artıyor ve hata yoksa sorun hız farkındadır — ve paralelliğin tavanı partition sayısıdır.Sözlükte gör → büyüyor.
Kafka — partition, consumer group, rebalance ve lag
Tohum 17Partition’lar · toplam lag 0 · zirve 0
- P0C0offset 0/0 · lag 0
- P1C0offset 0/0 · lag 0
- P2C1offset 0/0 · lag 0
- P3C1offset 0/0 · lag 0
Consumer group (2)
C0
P0 P1
0 işlendi
C1
P2 P3
0 işlendi
- Üretilen
- 0
- Tüketilen
- 0
- Rebalance
- 0
Şu an ne oldu?
Grup yetişiyor — lag yok
4 partition, 2 consumer arasında range stratejisiyle paylaştırılmış durumda.
Aklında kalsın: Sıralama garantisi yalnızca partition içindedir. Bir varlığın olaylarının sırası önemliyse, o varlığın kimliğini mesaj anahtarı yaparsın.
Görevler0/3
Hiç partition alamayan bir consumer oluşturaçık
İpucu
Consumer sayısını partition sayısının üstüne çıkar. Bir partition’ı aynı grupta en fazla bir consumer okuyabilir.
Bir rebalance başlat ve bitmesini izleaçık
İpucu
Çalışırken "Consumer ekle" veya "Consumer düşür"e bas. Rebalance süresince tüketim durur, üretim durmaz.
Adım başına 6+ mesajda lag’i sıfıra indiraçık
İpucu
Toplam kapasite (consumer × hız) üretimi geçmeli. Ama partition’dan fazla consumer işe yaramaz, bir consumer’a düşen partition’lar da dengeli olmalı.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
Sırayla dene:
Consumer ekle’ye iki kez bas. Önce rebalanceConsumer group'a üye girip çıktığında partition'ların yeniden dağıtılması. Klasik biçiminde tüm grup kısa süre durur — kapasite eklemenin görünmeyen bedeli budur.Sözlükte gör → yüzünden lag artıyor, sonra kapasite yettiği için eriyor. Kapasite eklemenin kısa vadeli bedeli budur.- Consumer sayısını 6 yap, partition 4 kalsın. İki consumer
boştaetiketiyle duruyor. Hiçbir katkıları yok, sadece grup üyesi olarak rebalance’a katılıyorlar. Trafik patlaması’na bas. Lag birden tırmanıyor; kapasite üretimin üstündeyse eriyor, altındaysa hiç kapanmıyor.Consumer düşür. Düşen consumer’ın partition’ları sahipsiz kalıyor, rebalance başlıyor, o süre boyunca kimse iş yapmıyor.- Stratejiyi
round-robinyap. 4 partition / 3 consumer dağılımı değişiyor — range bir consumer’a iki partition verirken round-robin daha düzgün dağıtıyor.
Partition tam olarak nedir?
Birikme basit bir hesaptır
toplam kapasite = consumer sayısı × consumer başına hız
Kapasite üretimden küçükse lag doğrusal olarak büyür. Bu bir hata değil, matematiktir.
Kafam karıştı, daha basit anlat
Müşteriler kasiyerlerin çalışabildiğinden hızlı geliyorsa sıra büyür. Bu bir arıza değil, basit bir hesap: ya kasiyer ekle ya da her birini hızlandır.
8 partition'lı bir topic'i okuyan consumer group'a 12 consumer eklersen ne olur?
Rebalance — kapasite eklemenin bedeli. Gruba bir consumer katıldığında veya bir consumer düştüğünde Kafka partition’ları yeniden dağıtır. Klasik (eager) protokolde bu stop-the-world’dür: tüm consumer’lar partition’larını bırakır, yeni atama yapılır, sonra herkes devam eder.
Bu sırada üreticiler durmaz. Lag tırmanır.
consumer eklendi │ ├─ tüm consumer'lar durdu ← lag tırmanmaya başlar ├─ koordinatör yeni atamayı hesapladı └─ consumer'lar yeni partition'larıyla devam ediyorKafka 2.4 ile gelen cooperative-sticky protokolü bunu düzeltir: yalnızca gerçekten el değiştiren partition’lar durur, geri kalan consumer’lar çalışmaya devam eder.
props.put( ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, CooperativeStickyAssignor.class.getName() // eager rebalance'ın duraklamasını kaldırır);Consumer lag artıyor ama consumer'lar hata vermiyor. En olası sebep nedir?
Anahtar ve sıralama
Mesajın anahtarı varsa partition hash(key) % partitionCount ile seçilir. Aynı anahtar her zaman aynı partition’a gider, dolayısıyla o anahtarın mesajları sıralı işlenir.
// Bir siparişin olayları hep aynı partition'a düşsün diye anahtar = orderIdproducer.send(new ProducerRecord<>("orders", order.id(), event));Anahtar yoksa mesajlar partition’lara dağıtılır ve sıralama garantisi kalmaz.
Topic 4 partition'lı ve anahtar orderId. Trafik arttı, partition sayısını 8'e çıkardın. Sipariş 42'nin olayları hâlâ sıralı işlenir mi? Cevabı göster
Geçiş anında hayır. hash(key) % 4 ile hash(key) % 8 farklı sonuç verebilir; sipariş 42 başka bir partition’a taşınabilir. Eski olayları eski partition’da, yenileri yenisinde kalır ve iki consumer onları aynı anda işleyebilir.
Offset commit — teslimat garantisini belirleyen yer.
| Strateji | Ne zaman commit | Garanti | Risk |
|---|---|---|---|
Otomatik (enable.auto.commit=true) | Zamanlayıcıyla | Belirsiz | İşlenmeden commit → mesaj kaybı |
| İşlemden sonra manuel | İş bitince | at-least-once | Çökme → tekrar işleme |
| İşlemden önce manuel | İş başlamadan | at-most-once | Çökme → kayıp |
Pratikte doğru cevap neredeyse her zaman at-least-once + idempotent tüketici’dir. exactly-once yalnızca Kafka’dan okuyup Kafka’ya yazan akışlarda mümkündür; araya bir veritabanı girince yine idempotency’ye dönersin.
Aşağıda üçü bir arada: olaylar hesap numarasıyla anahtarlanıyor, offset iş bitince commit ediliyor ve tekrar gelen olay bakiyeyi ikinci kez değiştirmiyor.
Derinleş · Kart harcamaları: anahtar, commit ve tekrar gelen olay 5 dosya · ~67 satır · ilk okumada atlayabilirsin
Kafam karıştı, daha basit anlat
Aynı siparişin bütün olayları aynı kasaya gitsin istiyorsan, anahtar olarak sipariş numarasını ver. Aynı anahtar hep aynı kasaya düşer.
Her ifadeyi doğru teslimat garantisine yerleştir.
Tuzaklar: kaç partition seçmeli?
Fazla partition da bedava değil: her partition broker’da dosya tanıtıcısı ve bellek tüketir, lider seçimi süresini uzatır ve uçtan uca gecikmeyi artırır.
Pratik yaklaşım: hedef throughput’u tek bir partition’ın ölçülen throughput’una böl ve büyüme payı ekle. Azaltamayacağın için biraz cömert davran, ama “ne olur ne olmaz” diye yüzlerce partition açmak gerçek bir maliyettir.
Kendini sına
Kafka'da bir mesaj okunduğu anda silinir.
8 partition'lı bir topic'i okuyan consumer group'ta 12 consumer var. Ne olur?
Aklında kalacak üç şey
- 1 Aynı anda çalışabilecek okuyucu sayısının tavanı partition sayısıdır. Fazla okuyucu boşta bekler.
- 2 Okuyucular yeniden dağıtılırken (rebalance) grup bir süre durur, mesajlar ise birikmeye devam eder. cooperative-sticky ayarı bu duruşu büyük ölçüde azaltır.
- 3 Sıra garantisi bütün konuda değil, tek bir partition içindedir. Bir şeyin olayları sıralı gelsin istiyorsan onun kimliğini mesaj anahtarı yaparsın.
4 kart sonraki derste seni bekliyor
Bu dersin üstüne kurulanlar
Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.
- Spring Boot EkosistemiSpring Kafka Hata Yönetimi — Bozuk Mesaj Partition'ı Durdurur mu?İşlenemeyen bir Kafka mesajı birkaç denemeden sonra nereye gider?Derse git
- Mikroservisler & Design PatternsOlay Şemasının Evrimi — Alanın Adını Değiştirdin, Kim Kırıldı?Yalnızca bir alanın adını daha anlaşılır yaptın. Ertesi sabah müşterilere "0 TL havale geldi" SMS'i gidiyor. Nasıl?Derse git