Merhaba;

Bugün sizlere Apache Kafka aracını anlatmak istiyorum. Elbette yeni bir teknoloji. Benimde yeni öğrenmeye başladığım bir konu. Yazdıklarımla ilgili yorumlarınızı duymak beni mutlu edecektir. Ek olarak Udemy’den konuyla ilgili “hands-on” eğitimde alıyorum. Tamamladığımda daha pratik örneklerle makalenin ikinci bölümünü yazmayı düşünüyorum.

Apache Kafka, genel anlamda akan verinin taşınması için kullanılan bir araçtır. Veri aktarımı için, kaynak ve hedef sistemleriniz vardır. Bilgi değiş tokuşu yapacağınız kaynak ve hedef sistem sayısı arttıkça, verinin sistemler arasında akışını sağlamanız gittikçe zorlaşacaktır. Verinin Sistemler arası akışını sağlarken, veriyi hangi protokolü kullanarak taşıyacağınızı (TCP, HTTP, REST, FTP, JDBC gibi), veriyi nasıl ayrıştıracağınızı (binary, JSON, Avro, Thrift gibi) belirlemeniz gerekiyor.

Apache Kafka, veri akışlarınızla, sistemleri ayrıştırmak için kullanılıyor. Hedef Sistemler, Apache Kafka üzerinden veriyi alabiliyor. Her veri tipini desteklemektedir. Veriler, web sayfalarından gelen olaylar, fiyatlandırma verileri, finansal işlemler, kullanıcı etkileşimleri gibi çok çeşitli olabilir. Veriyi Kafka içine aldıktan sonra, bu verileri veri tabanına, analitik sistemlerinize, e-posta, denetim gibi çok çeşitli sistemlerinize aktarabilirsiniz. Kafka, dağıtık, esnek, hata toleranslı ve yatay ölçeklenebilir bir yapı sunar. Bir sistemden diğer sisteme veri değiş-tokuşundaki gecikme 10ms’nin altındadır. Fortune 500 firmanın en az %35’i Kafka kullanıyor. Linkedin, Airbnb, Netflix, Uber, Walmart bu firmalardan bazılarıdır. Apache Kafka, bir mesajlaşma sistemi olarak, aktivite takip sistemi olarak, farklı sistemlerden metrik verisi toplamak, uygulamalardan log toplamak, veri akışlarını işlemek için kullanılabilir. Spark, Flink, Storm, Hadoop gibi pek çok büyük veri teknolojisini kullanarak büyük veri entegrasyonlarında kullanılabilir.

Netflix, Kafka’yı, TV programları izlerken gerçek zamanlı önerileri yapmak için kullanıyor. Uber, taksi, kullanıcı, gezi verilerini gerçek zamanlı kullanmak ve ileriye dönük talep tahminleri yapmak için Kafka’yı kullanıyor. Linkedin, kullanıcı etkileşimlerini gerçek-zamanlı toplayarak, bağlantı önerileri yapmak için Kafka’yı kullanıyor.

No alt text provided for this image

Şekil 1. Kafka Merkezi Mesajlaşma Sistemi (Kafka, veriyi üreten (“producer”) ve veriyi tüketen (“consumer”) Sistemler arasında iletişimi sağlıyor).

Kafka terminolojisine giriş yapmamızın zamanı geldi. Kafka ile ilgili duyacağınız en önemli kelimeler, “topics”, “producers”, “consumers”, “brokers” olacaktır. Tüm Kafka mesajları, “topics”ler şeklinde organize edilir. Eğer bir mesaj gönderecekseniz, bu mesajı spesifik bir “topic” e gönderirsiniz. Eğer bir mesajı okumak isterseniz, bu mesajı spesifik bir “topic” den okursunuz. Veriyi tüketen (“consumer”), mesajı Kafka “topic” olarak alır, veriyi üreten (“producer”), mesajı, Kafka “topic” olarak, Kafka’ya yazar. Kafka’nın dağıtık bir sistem olduğunu söylemiştik. Cluster içerisinde yer alan her node, “Kafka broker” olarak isimlendirilir.

Kafka “topic” in anatomisini irdeleyelim. Kafka “topics”, “partitions” dediğimiz yapılara bölümlenir. “Partitions”lar sayesinde, “topics” lerin paralelliği sağlanır. Çünkü belirli bir “topic” içindeki veriyi, farklı “broker” larda tutulacak şekilde parçalara ayırır. Her “partition”, farklı sistemlerde tutulabilir. Bu sayede, veriyi tüketen yapılar, bir “topic” paralel olarak okuyabilir. Ben bu yapıyı, sistemci olarak RAID yapılarında “stripe” mekanizmasına benzetiyorum. Biliyorsunuz, veriyi daha hızlı okuyabilmek için, veri, belirleyeceğimiz “block size” lara göre “stripe unit” lere bölünerek, farklı fiziksel disklerde tutuluyor. Bu sayede, verinin yazıldığı her diskin, IO gücünü kullanarak, verimizi paralel olarak daha hızlı okuyabiliyoruz. Kafka partition yapısında da benzer durum var. Siz verinizi, parçalara ayırarak, farklı sistemlerde tutabiliyor ve bu farklı sistemlerin hesaplama gücünü kullanarak, yine farklı sistemlerin bu veriyi parallel okumasını sağlayabiliyorsunuz.  Partition içindeki her mesaj, “offset” olarak isimlendirilen bir tanımlayıcıya sahiptir. Kafka elbette mesaj sırasını korur. Veriyi tüketen taraf, spesifik bir “offset” den itibaren mesajı okuyabilir. Ek olarak, seçilen bir “offset” noktasından da mesajları okumasına izin verilir. Aslında Kafka cluster içindeki spesifik her mesaj, “partition”, “offset” ve “topic” den oluşan tanımlama grubu ile tek olarak adreslenebilir, tanımlanabilir. Kafka, mesajları, ayarlanabilir bir zaman aralığı içinde muhafaza eder. Şöyle bir örnek verelim, eğer Kafka,  mesajları bir gün saklayacak şekilde  ayarlanmışsa, eğer veriyi tüketen bir günden fazla bir süre çalışamaz durumdaysa, veriyi tüketen bu mesajı kaybedecektir. Ama eğer veriyi tüketen bir saat çalışamaz durumda kaldıysa, tekrar çalışmaya başladığında, en son bilinen offset’den itibaren veriyi okumaya başlayabilir.

“partitions” ve “brokers” kavramlarından bahsetmiştim. Her “broker”, birden fazla “partitions” tutar. “Partitons”lar, bir “topic” için lider veya replika olabilir. Tüm yazma ve okuma işlemleri lider üzerinden yönlendirilir. Lider, replikaların yeni veriyle güncellenmesini koordine eder. Eğer lider bir şekilde hata alırsa, bir replica, lider görevini devralır.

No alt text provided for this image

Şekil 2. Bu şekilde üç tane broker görüyoruz. Kırmızı renkli “partition” lar lider, mavi renkli olanlar ise replikadır.

Veriyi üreten, tek bir lidere yazar, lider de replikaları diğer “broker” lara çoğullar. Böylelikle her “write” işlemi, farklı “broker” ve sistemlerde servise sunulur.

No alt text provided for this image

Şekil 3. Veri üreten, “topic” in “partition 0”nına yazar. “Partition 0” da bu “write” işlemini, replikalara çoğullar. Her yazma işleminden ilgili makine sorumlu olduğu için, yazma hızı “node” sayısına göre artış gösterecektir.

“Consumer” lar, verilen bir topik için “consumer” gruplar şeklinde organize edilebilir. Grup içindeki her “consumer, “tek bir “partition” dan okuma yapar. Grup, “topic” in tamamının mesajlarını tüketir. Eğer, “partition”dan daha fazla “consumer” varsa, bazı “consumer” lar boşta kalacaktır çünkü okunacak başka “partition” yoktur. Eğer “consumer”dan daha fazla “partition” varsa, “consumer” lar birden fazla “partition”dan mesaj alacaktır. Eğer eşit sayıda “partition” ve “consumer” varsa, her “consumer” mesajları bir “partition”dan alacaktır. Şekil 4’de, tek bir “topic” için birden fazla “partition” varsa, mesajların okuma şeklini iki “consumer” grup için görmekteyiz. Şekil’de, Server1, “topic” için, “partition 0” ve “partition 3” ü tutsun. Server2, “partition 1” ve “partition 2” yi tutsun. A ve B isimli iki tane “consumer” grup olsun. A grubu, 2 “consumer”dan, B grubu, 4 “consumer”dan oluşsun. Grup A, 4 “partition” için 2 “consumer” içerir. Her “consumer”, 2 “partition”dan okur. Grup B ise “partition” ile aynı sayıda “consumer” içerir. Bu durumda, her “consumer”, bir “partition” okur.

No alt text provided for this image

Şekil 4. “Consumer” grup ve “partition” ilişkisi.

Kafka veri bütünlüğünü ve veriye her zaman ulaşabilmeyi aşağıdaki kurallara göre garanti eder.

Topic bölümlemesine gönderilen mesajlar, gönderildikleri sıra ile işlem logunda tutulur.

Mesajı tüketen (“consumer”), mesajı, “log”da göründüğü sıra ile görür.

Tüm replikaların loglarına işlem, işlendiğinde mesaj kabul edilir, mesaj alınmış olur.

Bir replica her zaman aktif, sağlıklı kaldığı müddetçe mesaj kaybı yaşanmaz.

Kafka cluster’da tüm mesajların, lidere gönderildiğini aktarmıştım. Lider mesajı kendine yazdıktan sonra , mesajı işledikten sonra, mesajı farklı “broker” lar üzerine farklı replikalar olarak yaymaktan sorumludur. Her replica mesajı aldıktan sonra, aldığına dair bilgilendirme mesajı yayınlandıktan sonra, tüm replikaların senkron olduğu kabul edilir.

Bu makalemin sonuna geldim. Daha çok çalışma şeklini aktarmaya çalıştığım Kafka yapısı için devamı olacak makalemde daha fazla pratik örnek aktarmayı hedefliyorum. Kafka şimdiden, pek çok büyük organizasyonun, veri işlemleri için omurgası olmuş durumdadır. Esnek, ölçeklenebilir, dağıtık ve paralel çalışma mantığından ötürü yüksek performans sağlayan Kafka, ek olarak veriyi üreten ve veriyi tüketen yapıları akıllıca ve etkin olarak ayrıştırabilmektedir. Çok genel bir bilgilendirme sunduğum bu makalem sonrası pratik örneklerin olacağı ikinci makalemde görüşmeyi diliyorum.

12 Haziran 2019 – Asiye Yigit

Kaynakça:

https://sookocheff.com/post/kafka/kafka-in-a-nutshell/

Stephane Maarek – Udemy Kafka kurs