Kafka Nedir?
Kafka, dağıtık mimari ile tasarlanmış bir mesajlaşma sistemidir (Distributed Messaging System). LinkedIn tarafından 2010 yılında geliştirilmeye başlanan projedir. 2011 yılında, Apache Software Foundation aracılığıyla açık kaynaklı bir yazılım haline getirildi ve yazılım dünyasına, gerçek zamanlı (realtime) veri akışlarını (stream) yönetmek için güçlü bir çözüm sunulmuş oldu.
Kafka sağladığı hız avantajı ile büyük ölçekli mesajlaşma uygulamalarında veya streaming uygulamalarında kullanım tercihinde ilk sırada yer alır. Streaming servislerde tercih edilmesinin sebebi kuyruktaki mesajların diskte kalıcı olarak saklanmasıdır. Amazon AWS üzerinde 1-2 CPU ve 4 GB RAM ile saniyede 135000 mesaj yazma işlemi burada test edilmiştir. İyi yapılandırılmış bir Kafka cluster üzerine saniyede iki milyon mesaj yazılabilmektedir.
Kafka Temel Özellikleri
- Bir sistem için mesaj üretenler ile bu mesajları tüketenleri birbirinden ayırmak. Mesaj üreten uygulamalar Producer ve tüketen uygulamalar Consumer olarak adlandırılır. Producer uygulamalar mesajları yayınlama (Publish) yöntemi ile sisteme bırakırken, Consumer uygulamalar sisteme abone (Subscribe) olarak mesajları alırlar.
- Mesajlar sisteme geldikleri sırayla kaydedilirler.
- Mesaj akışları gerçek zamanlı (realtime) olarak işlenebilir.
- Sistem, dağıtık mimari tasarımı sayesinde yatak olarak büyüyebilmektedir. Birden fazla sunucu (broker) bir araya gelerek küme (cluster) mantığında organize bir şekilde çalışabilmektedir.
- Sisteme kaydedilen veriler değiştirilemez özellikte olup diskte kalıcı olarak tutulur. Bu düzen, veri tabanlarındaki commit log yapısına benzer. Log yapısının özelliği, log dosyalarına yazılan kayıtların daha sonra değiştirilmemesidir. Dosyaya sadece yeni satırlar eklenir.
Kafka Topic, Partition, Offset Bileşenleri
Kafka ile veri işleme sırasında kullanılan temel bileşenler Topic, Partition, Offset şeklinde sıralanabilir.
Kafka Topic
Mesajların bir veya birden fazla gruba bölünmüş (partitioned) halde tutulduğu yerdir. Verilerin birbirinden ayrılmasını sağlayan mantıksal gruplardır. Veri tabanı tabloları veya işletim sistemindeki klasörler gibi düşünülebilir. Bir Topic, birden fazla Kafka broker (sunucu) üzerinde dağıtık bir şekilde tutulabilir. Bu sayede ölçeklendirme sağlanarak, bir broker kapandığında veri kaybı yaşanmadan diğer broker üzerinden veri erişimi devam eder.
Kafka Partition
Sürekli olarak mesaj eklenen sıralı, değişmez bir mesaj dizisidir. Bir topic bir veya daha fazla partition’dan oluşabilir. Bir partition, broker veya diskler arasında bölünemezler, bitişik olmalıdır. Ancak bir topic iki sunucuya dağıtıldığında iki farklı sunucuda partition’lar yine bütün olarak dağılmış olur. Yani Partition1 için ilk N veri A sunucusunda, geri kalanı B sunucusunda olamaz. Partition1 bütün olarak iki sunucuda aynı topic adı altında bulunur.
Gönderilen mesajlarda bir anahtar (key) değeri verilmediğinde, round robin algoritmasına göre mesajlar sırayla her partition içerisine yerleştirilir.
Partition ile verileri gruplar halinde tutabilmek mümkündür. Örneğin customers topic ile müşteri bilgilerinin tutulsun. Müşterilerin kimlik numarasının son hanesine göre P0,P1,…P9 şeklinde 10 partition oluşturularak kaydedilebilir. Bu durumda partition içerisindeki veri sayıları aynı olmaz.
Consumer uygulaması hangi partition içerisinden veri alacağı ile ilgilenmez. Doğrudan subscribe olarak verileri alabilir. Partition’lar sisteme bağlanan consumer veya consumer gruplara otomatik olarak atanır. Örneğin 3 partition bulunan bir topic’e bağlanan A grubunda tek bir consumer var ise üç partition’a gelen veri doğrudan bu consumer tarafından tüketilir. B grubunda iki consumer olduğunu var sayalım. Bu durumda iki partition bir consumer’a kalan bir partition ise diğer consumer’a yönlendirilir. C grubunda üç adet consumer var ise topic’deki her partition verisi gruptaki bir consumer’a yönlendirilir.
Kafka Offset
Partition içerisindeki mesajlara, her mesajı benzersiz şekilde tanımlayan, ofset adı verilen sıralı bir kimlik numarası atanır. Bu bilgi offset topic içerisinde tutulur. Offset bilgisi, topic içerisindeki bilgileri okumak için bağlanan Consumer uygulaması, her veri okuduğunda bir artırılarak uygulamanın sıradaki okunacak mesaj indeksini tutar. Bu sayede Consumer kapanıp tekrar açıldığında verileri en baştan almaz.
Kafka topic mesajlarının silinmesi
Kafka sisteminde okunan mesajlar hemen silinmez. Mesaj sone erme süresi boyunca tutulduktan sonra otomatik olarak silinir.
Kafka sisteminde mesaj silmenin üç farklı yöntemi vardır.
- Mesaj Expiry süresine göre silme. Bu süre Kafka üzerinde topic oluşturulurken retention.ms olarak ayarlanabilmektedir. Kafka’nın performansı, veri boyutundan etkilenmez, bu nedenle çok sayıda veriyi saklamak sorun olmaz.
- Kayıt silme yöntemi ile kayıtlar doğrudan silinebilmektedir.
kafka-delete-records.sh
aracı ile kayıtlar doğrudan silinebilmektedir. - Topic silme yöntemi ile tüm topic silinebilir.
Kaynaklar
- https://kafka.apache.org