Apache Kafka Nedir? | Nerelerde Kullanılır?

Apache Kafka

Gün içinde her birimiz gerek çeşitli internet ortamlarında, gerekse sosyal medya platformlarında onlarca hatta yüzlerce veri üretiyoruz. Bu çember tüm dünyadaki internet kullanıcılarını kapsayacak biçimde genişledikçe verinin boyutu bir hayli büyüyor ve bu üretilen veriler anlık olarak büyümeye devam ediyor.

Her gün git gide büyüyen bu veriler, iki temel problem meydana getiriyor. Bunlardan ilki büyük miktardaki veriyi toplamak, diğeri ise analiz etmek.

Büyük veriyi kaynağından alıp analiz edilebilir hale getirmek için de her geçen gün çeşitli teknolojiler meydana çıkıyor. Geçtiğimiz günlerde veri aktarımı için kullanabileceğimiz bir teknolojiden ‘Apache Flume’dan bahsetmiştim. Bugün de size Apache Kafka’dan bahsedeceğim.
Apache Kafka, Linkedin bünyesinde geliştirilerek 2011 yılında Github’a konulmuş, Java ve Scala dilleri ile geliştirilmiş açık kaynak kodlu bir projedir. Kafka, büyük veriler ile çalışabilen, ölçeklenebilir, dağıtık sistemlere uygun, anlık toplanan veriyi hızla ve hatasız bir biçimde aktarabilen bir mesajlaşma sistemidir.

Peki Mesajlaşma Sistemi (Messaging System) nedir?

Mesajlaşma Sistemi, verileri bir uygulamadan diğerine aktarmaktan sorumludur. Bu sayede uygulamalar verinin nasıl geldiği ile ilgilenmek yerine tüm konsantresini veriye ve yapması gereken işe verebilirler çünkü verilerin sisteme doğru gelip gelmediği ile mesajlaşma sistemleri ilgilenir. Dağıtık mimarili bir yapıda verinin kaynaktan hedefe aktarılmasında önemli olan ilk koşul verinin güvenilirliğidir. Veri kaynaktan hedefe aktarılırken her hangi bir bozulmaya uğramaması için mesaj kuyrukları (message queuing) kavramı kullanılır. Mesaj kuyrukları sayesinde aktarılacak veri bir sıraya alınır ve o sıraya göre aktarılırlar.

İki tür mesajlaşma kalıbı mevcuttur bunlar, Point to Point (Noktadan Noktaya) ve Publish-Subscribe (Yayın-Abone) ‘dır.

Kısaca bunların ne olduğundan bahsedecek olursak,

Point to Point: Mesajlar bir sıralanarak bir kuyruk oluşturur, kuyruktaki mesajlar sıra ile tüketici veya tüketiciler tarafından istenebilir. Ancak bir mesaj yalnızca bir tüketici tarafından tüketilebilir ve tüketildikten sonra kuyruktan silinir. (Bu durumu online satışta bir tane kalan Zara blazer ceket gibi düşünebilirsiniz 🙂 )
Bu durum kuyruktaki tüm mesajlar için geçerlidir.

Publish-Subscribe: Yayınlama-abone olma sisteminde, mesajlar bir konuyla kalıcıdır. Noktadan noktaya sistemin aksine, tüketiciler bir veya daha fazla konuya abone olabilir ve o konudaki tüm mesajları tüketebilir.
Yayınla-Abone olma sisteminde, mesaj üreticilerine yayıncılar, mesaj tüketicilere aboneler denir. Gerçek hayatta olan bir örnek, bir sınıf öğretmeni, okulun sistemine her gün öğrencilerin okumaları için yazılar paylaşıyor olsun. Öğrenciler de sisteme abone olmuş öğretmenlerinden gelen yazıları takip ediyor olsunlar. Bu durumda öğretmen publisher(yayıncı) ve öğrenci de subscriber(abone) olmaktadır. Bir yazıyı, sisteme abone olan her öğrenci okuyabilir. İşte bu gibi sistemlere de pub/sub tasarımlı mesajlaşma sistemleri denilmektedir.

Öyleyse Apache Kafka nedir ve hangi mesajlaşma sistemini kullanıyor?

Kafka büyük veriyi idare edebilen ve bir uç noktadan diğerine mesajlar iletmenizi sağlayan dağıtık sistemlere uygun çalışabilen ve Publish-Subscribe (Yayın-Abone) yöntemini kullanan bir mesajlaşma sistemidir.
Kafka çevrimdışı ve çevrimiçi mesaj tüketimine uygundur. Kafka iletileri diskte kalıcıdır ve veri kaybını önlemek için küme içinde çoğaltılmıştır.

Kafka’nın Yararları neler?

Dağıtık, bölünmüş, çoğaltılmış ve hata toleransı yüksek olan bir araç olduğu için oldukça güvenilirdir.
Kafka mesajlaşma sistemi, işten vazgeçmeden kolayca ölçeklenir.
Kafka, mesajları diskte tutar.
Oldukça hızlıdır sıfır kesinti ve sıfır veri kaybını garanti eder dolayısıyla dayanıklılık özelliği vardır.
Ve tabi en önemlisi performans etkisidir. Kafka, publish-subscribe mesaj sistemi ile yüksek verimlilik sağlar. Bir çok terabyte seviyesinde ileti depolansa dahi yüksek performansını korur.

Kafka’yı nerelerde kullanabiliriz?

  • Apache Kafka, genellikle operasyonel veriler için kullanılmakta. (Doğrudan rakiplere, bir şirketin emek istatistiklerine, tedarikçilere, muhasebe verilerine ve ihtiyaç duyulan kaynakların projeksiyonuna ilişkin bilgiler, operasyonel verilere dahil edilebilir.)
    Bu, operasyonel verilerin merkezi olarak gönderilmesini sağlamak için dağıtılmış uygulamalardan istatistiklerin toplanmasını içerir.
  • Diğer bir kullanım alanı ise, log toplama ile ilgilidir. Birden çok hizmetten log toplamak ve bunları birden çok kişi için standart bir biçimde kullanılabilir kılmak için kullanılabilir.
  • Kafkanın ayrıca Spark Streaming ile birlikte de kullanılabilir, Spark Streaminig, verileri okur, işler, işlenmiş verileri yeni bir konuyla kullanıcıların ve uygulamaların kullanımına açar.
    Stream Processing (Akış işleme) bağlamında Kafka’nın dayanıklılığı büyük avantaj sağlar.

    Kafka’nın Çalışma prensibi nasıl?

Kafka’nın çalışma prensibini ilk etapta yüzeysel bir biçimde ifade etmek için aşağıdaki diyagramdan faydalanılabilir.

Apache Kafka çalışma prensibi diyagramı I

Bu diyagramda görüldüğü gibi üreticiler tarafından alınan veriler Kafka Cluster’ile  tüketicilere sunuluyor. Ancak buradaki Kafka cluster aslında tek bir makine değil, buradaki Cluster aslında bir server grubu ve her bir server’a broker ismi veriliyor.

Bu diyagramın ayrıntılarına geçmeden önce Topics, Partition, Partition Offset, Replicas of Partition, Brokers, Kafka Cluster, Producers, Consumers, Leader, Follower gibi temel kavramların anlamlarını bilmekte fayda var.

Topics(Konular/Başlıklar),

  • Belirli bir kategoriye ait olan bir ileti dizisine bir Topic denir. Veriler topic’lere depolanır.
  • Her topic’e bir isim atanabilir.
  • Topicler partition’lara ayrılmıştır. Bu partitionların kaç tane olacağına kullanıcı kendisi karar verebilir ya da default değerleri kullanabilir.
  • Bu tür topiclerin her biri değiştirilemez sıralı bir sıradadır.
  • Bir partition, eşit büyüklükte segment dosyaları olarak uygulanır.

Partition(Bölüm), Topic’ler çok sayıda partition’lardan oluşabilir. Bu nedenle keyfi bir miktarda veri işleyebilir.

Partition Offset(Bölüm Ofset), her bölünmüş mesaj, ofset olarak adlandırılan benzersiz bir sıra id’si taşır.

Replicas of Partition(Bölüm kopyaları), Replikalar, partition yedekleridir. Replikalardan asla veri okunup veri yazılmaz okunup veri yazmaz. Veri kaybını önlemek için kullanılırlar.

Brokers(Aracılar),

  • yayınlanan verilerin korunması için basit bir sistemdir. Her broker, topic başına sıfır ya da daha fazla partition’a sahip olabilir. Bir topic içinde N partition ve N sayıda broker varsa her broker bir partition’ı içerir.
  • Bir topic’in N partition’ı olduğunu ve bu topicte de N’den fazla broker olduğunu varsayalım(N+M).
    Bu durumda ilk N broker, N partition’ı sahiplenecektir. Geriye kalan M broker ise o topic için herhangi bir partition’a sahip olamayacaktır.
  • Bir topic’te N partition varsa ve N’den daha az broker varsa(N-M), her bir broker’ın arasında bir veya birden fazla partition paylaşımı olacaktır. Bu da eşit olmayan iş yükü sebebiyle sorun yaratır ve bu yüzden bu yöntem önerilmez.

Kafka Cluster, Kafka’nın birden fazla broker sahibi olması Kafka kümesi olarak anılır. Bir Kafka kümesi kesinti olmaksızın genişletilebilir. Bu kümeler, mesaj verisinin kalıcılığını ve replikasyonunu yönetmek için kullanılır.

Producers(Üreticiler), Producerlar, bir veya daha fazla Kafka topiclerinin üreticisidir. Üreticiler Kafka brokerlarına veri gönderirler. Bir producer broker’a bir mesaj yayınladığında her zaman broker mesajı son segment dosyasına ekler. Aslında mesaj bir bölüme eklenir. Üretici, seçtiği herhangi bir partition’a da mesaj gönderebilir.

Consumers(Tüketiciler), Consumerlar brokerlardan veri okuyan tüketicilerdir. Tüketiciler bir veya daha fazla konuya subscribe(abone) olabilirler ve brokerlardan veri çekerek yayınlanmış mesajları tüketirler.

Leader(Lider), verilen partitiondaki tüm okuma ve yazma işlemlerinin sorumlusu olan düğümdür. Her partiton’ın lider olan bir sunucusu vardır.

Follower(Takipçi), Lider talimatlarını takip eden bir düğüm takipçisidir. Lider başarısız olursa, takipçilerden biri otomatik olarak yeni lider olur. Bir takipçi, normal tüketici görevini görür, iletileri alır ve veri havuzunu yeniler.


Yukarıdaki bilgiler ışığında aşağıdaki diyagramı inceleyecek olursak,

Apache Kafka çalışma prensibi diyagramı II

  1.  Bir veya birden fazla producer, mesajı partitionlara iletiyor. -Mesajın belirli bir partition’a gitmesini istiyorsak bunu belirleyebiliriz veya Kafka’nın belirlediği default partition’lara iletimleri sağlanır. –
  2.  Bu partitionların her biri bir topic’te tutulur. -Bu topiclere yeni bir isim verilebilir ve istenildiği kadar topic oluşturulabilir. –
  3.  Her partition bir broker’a gidiyor, bir Kafka Cluster’ın içinde birden fazla broker bulunabiliyor.

    Apache Kafka çalışma prensibi diyagramı III

  4.  Bu brokerların her birinin içinde server’lar bulunmakta. Kafka ekosisteminde, her broker için bu serverlar arasından bir lider, server olarak seçiliyor.
  5. Diğer serverlar ise follower olarak adlandırılıyor ve lider serverda bir problem olduğunda bir follower kendini lider olarak atayabilecek şekilde tasarlanmış.
  6. Her bir server kendi içinde gelen mesajın replikasını tutuyor. Böylelikle, her hangi bir olumsuz durumda mesaj kuyruğundaki herhangi bir verinin kaybolmasının önüne geçilebiliyor. (İsterseniz replikasyon işlemini de ayarlayarak iptal edebilirsiniz, bu sizin verinizin önemli olup olmadığına bakar. Eğer replikasyon işlemini iptal ederseniz bir nebze daha hızlı çalışması söz konusudur.)
  7. Daha sonra consumer’lardan oluşan Consumer gruplar,  mesajları güvenli bir biçimde okuyabiliyor. Bir mesajı okumak için birden fazla Consumer grup istek yapabilir ancak her consumer grubu içindeki consumerlar aynı anda aynı mesajı okuyamazlar.
  8.  Hangi consumer’ın hangi ofsetteki mesajı okuduğu vs. bilgisi Zookeper’da tutuluyor.
  9. Zookeper, Kafka brokerlarını yönetmek üzere kullanılan bir servistir. Kafka hangi mesajın hangi partition’da hangi ofsette olduğu bilgisini hangi consumer’ın hangi partition’a gitmesi gerektiği vs. bilgilerine erişmek için Zookeper’ı kullanıyor.

Tüm bu işlemler oldukça hızlı oluyor. Apache Kafka, büyük boyutlu verileri güvenli ve ölçeklenebilir  şekilde aktarmak isteyen kullanıcılar için gerçekten biçilmiş kaftan denilebilir.

Apache Kafka ile ilgili yazım umarım faydalı olmuştur. Bir sonraki blog yazımda Spark Streaming, Kafka ve Flume arasındaki farkları anlatacağım bir yazı paylaşacağım.

Düşüncelerinizi yorum veya mail yoluyla belirtirseniz çok sevinirim.
İyi çalışmalar dilerim.

“Apache Kafka Nedir? | Nerelerde Kullanılır?” için 3 cevap

  1. Hiç bilmediğim bir konuydu. Gerçekten çok ilgimi çekti ve anlatımınız harika… Çok teşekkür ederim, emeğinize sağlık…

  2. Öncelikle yazı için teşekkür ediyorum. Bir soru sormak istiyordum, lider server da problem çıkmasın durumunda followerlardan biri kendini lider ilan ediyor evet ancak bu işlem random mı yapılıyor yoksa her follower ın bir aıralama numarası var , öncelik sırası mı göz önünde bulunduruluyor, ya da bambaşka bir şekilde mi?
    Teşekkürler

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir