Apache Kafka Nedir? Nasıl Çalıştırılır? Örnek Apache Kafka-React.js-Node.js-Socket.io Uygulaması

Kaan Bayram
Kodcular
Published in
5 min readOct 16, 2019

Kafka Nedir?

Apache Kafka LinkedIn tarafından geliştirilen ve şuan Apache bünyesinde bulunan, büyük verileri anlık olarak depolamak ve analiz etmek için kullanılan açık kaynak bir framework’dür. Büyük verileri hızlı bir şekilde depolayıp analiz etmek için ise mesajlaşma sistemini (queue) kullanmaktadır.

Ne Amaçla Kullanılır?

Gerçek zamanlı veri akışı ve analizi şirketlerin veya kuruluşların anlık olarak gelen güncel bilgiler ile ne stoklamaları neleri satmaları gibi kararları vermesinde yardımcı olur. Şirketler ise karar vermelerini sağlayan bu verileri amaçları doğrultusunda depolayıp analiz etmek için oldukça performanslı olan Apache Kafka’yı kullanırlar. Ne işe yaradığı konusunda kafanızda soru işaretleri kaldıysa daha açıklayıcı bir örnek ile belki bunu giderebiliriz. Popüler ve anlık olarak çok fazla aktif kullanıcıya sahip bir web sitesi, aktif kullanıcıların site içerisindeki davranışlarından haberdar olmak istiyor, düşünüldüğünde binlerce kullanıcının aynı anda bu sitede aktif olarak bir sürü işlem gerçekleştirdiğini sayfadan sayfaya ilerlediğini ve butonlara bastığını varsayalım ve bu verinin toplanması gerektiğini. Oluşan verinin ne kadar hızlı arttığını hayal edin. İşte bu gibi durumlarda şirketler Apache Kafka ve kullandığı mesajlaşma sistemi sayesinde bu kullanıcı loglarını anlık olarak hızlı bir şekilde depolayabilir ve analiz edebilir. Amazon,Netflix, Spotify gibi şirketler bu teknolojiyi aktif olarak kullanmaktadır.

Yapısı ve Kavramlar

Fazla detaylandırmadan kafamızda bir şeyler canlandırabilmek adına yüzeysel olarak bahsetmek istersek. Öncelikle Kafka içerisindeki Topic,Producer ve Consumer kavramlarını inceleyelim.

Topicler kullanıcı tarafından isimlendirilebilen, verilerin (mesajların) depolandığı alandır. Topicler Partitionlara ayrılmıştır ve depolandığı Partition sayısı kullanıcı tarafından belirlenebilir. Producerler ise bu Topiclere mesaj gönderebilen Apache Kafka’nın Publish-Subscribe yapısına baktığımızda Publisher konumundadır. Topicler içerisine veri yani mesaj gönderebilirler ve aynı anda birden fazla konuya bağlı olabilirler. Consumer ise adından anlayabileceğimiz gibi Producerlar tarafından Topiclere gönderilen mesajları tüketen Subscriberlardır. Bir konuya (Topic) birden fazla Producer mesaj gönderebilir ve yine bir konuya birden fazla Consumer dahil olup Topic içerisine gönderilen verileri okuyabilir, producerların gönderdiği bu mesajları bir consumer okuduktan sonra bu veriler Topic içerisinden silinmez . Konu başında verdiğimiz örnek ile daha iyi anlayabilmemiz için bu yapıya göre Consumer kullanıcı loglarını toplayan şirket, Producer ise şirkete veri gönderen kullanıcılar konumundadır.

Kafka yapısı

Partition

Topicler görselde görüldüğü gibi Partitionlardan oluşur ve Topic içerisindeki veriler bu Partitionlarda sıralı ve değiştirilemez olarak eklenirler ve artan şekilde bir offset değeri alırlar. Topic’in depolanacağı bu Partition sayısı kullanıcı tarafından belirlenebilir.

Brokers

Brokerlar Topic ve Partitionları tutan sunuculardır. Brokerlar Topiclerin depolandığı Partitionları içerir ve eğer aynı sayıda Broker ve Partition varsa her Broker bünyesinde bir Partition bulundurur. Partition sayısı Broker sayısını geçtiğinde ise bu sayı eşit olarak Brokerlar arasında dağıtılır. Bir kafka Broker grubuna ise Kafka Cluster denir. Her Broker içerisinde, bir server Lider seçilir, diğer serverlar follower olarak adlandırılır ve içerisinde verilerin kopyasını tutarlar. Herhangi bir sorun durumunda bu follewerların kendisini Lider olarak atama yeteneği vardır ve bu sayede veri akışı kesintisiz olarak devam eder. Kopya alınacak server sayısını ise kullanıcı belirleyebiliyor ve elbette ki kopya sayısı performansa olumlu-olumsuz etki edebiliyor.

Kurulum-Çalıştırma

Apache Kafka’yı çalıştırmak için Zookeeper ve Kafka’yı indiriyoruz. Herşeyden önce Apache Kafka’yı çalıştırabilmek için Java’yı indirip bilgisayarımıza kurmamız gerekiyor:

Zookeeper:

Apache Kafka:

İndirdikten sonra karşımıza çıkan klasörler şu şekilde olmalı.

Zookeeper Klasörü
Apache Kafka Klasörü

Apache kafkayı çalıştırabilmek için öncelikle Zookeeper’ ı çalıştırmamız gerekmekte. Peki Neden?

Çünkü Kafka Partitionlarda tuttuğu Offset bilgileri gibi bilgileri Zookeeperdan almakta. Bu yüzden önce Zookeeper’ı ardından Kafka’yı çalıştıracağız.

Komut istemini açıyoruz ve Zookeeper klasöründeki bin klasörüne giriyoruz.

Bu dizine geldikden sonra “zkServer.sh” start komutu ile Zookeper’ımızı başlatıyoruz.

Eğer yeni bir console açılıp şöyle bir ekran ile karşılaşırsak Zookeeper’ın çalıştığından emin olabiliriz.

Zookeper’ı çalıştırdıktan sonra Apache Kafka’yı çalıştırmamız gerekiyor.

Kafka içerisinde /bin/Windows dizinine gidip “Kafka-Server-start.bat ..\..\config\Server.properties”

Komutu ile Kafka’yı başlatabiliriz ve karşımıza şöyle bir ekran gelmesi gerekiyor.

Sırası ile Zookeeper ve Apache Kafka’yı çalıştırdıktan sonra Topic oluşturup Producer ve Consumer olarak veri gönderip alabiliriz.

Kafka/bin/windows yoluna ulaştıktan sonra “kafka-topics.bat — create — zookeeper localhost:2181 — replication-factor 1 — partitions 1 — topic topic1” komutunu çalıştırarak topic1 konusunu oluşturuyoruz.

Daha sonra “kafka-console-producer.bat — broker-list localhost:9092 — topic topic1” komutu ile topic1 konusuna Producer olarak bağlanıyoruz ve ilk mesajımız olan mesaj1’i konuya gönderiyoruz. Gönderdiğimiz bu mesajı görebileceğimiz bir de Consumer oluşturalım.

“kafka-console-consumer.bat — bootstrap-server localhost:9092 — topic topic1 — from-beginning”

komutu ile Consumerımızı oluşturuyoruz ve gördüğünüz gibi producer tarafından yolladığımız mesajı görebiliyoruz.

Apache Kafka-React.js-Node.js-Socket.io Github Proje linki:

Node.js ile çalıştırdığım Apache Kafka’yı Consumer mesajlarını anlık olarak Client tarafına göndermek gibi işlemleri, klasik GET-POST işlemleri ile yapabilmek mümkün olmadığından bu işlemleri chat uygulamalarında sürekli olarak kullanılan socket.io ile gerçekleştirdim. İlgilenenler için faydalı olabilir.

--

--