Apache Kafka CLI Uygulaması
Merhabalar, önceki yazımda Apache Kafka’ya giriş yapıp, temel bileşenlerinden bahsetmiştim. Bu yazıdaysa kavramların daha iyi anlaşılması için komut satırında uygulama yapacağım. Özellikle topic partition ve consumer group gibi kavramların üzerinde durmayı planlıyorum.
1 – Kafka Topic Özellikleri
Kafka’da topic ile ilgili işlemler kafka-topics komutuyla yapılır. –create ile yeni bir topic oluşturabiliriz. Topic’ler daha önceleri sadece zookeeper ile oluşturulabilirken, zamanla Zookeeper’a olan bağımlılığı kırmak için Kafka broker’ları üzerinden de topic oluşturmaya olanak sağlandı.
kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic kitap
–bootstrap-server localhost:9092 yerine –zookeeper localhost:2181 yazarsanız (zookeeper’ınız farklı makinada ise o makinanın ip’sini yazmanız gerekiyor) topic aynı şekilde oluşacaktır.
Kafka’da bir komutun ne yaptığıyla ilgili yardım almak ve komutla birlikte kullanılan kodları öğrenmek için o anahtar kelimeyi yazıp enter’a basmak yeterlidir. Mesela kafka-topics yazarsak, komutun ne yaptığıyla ilgili özet bilgiye ve komutla birlikte kullanılan işlemlerin listesine alfabetik sırada ulaşabiliriz. Şekil – 1’de bu işlemlerle ilgili listenin bir kısmı görünmektedir.
Kafka’da oluşturduğumuz topic’lerin listesine –list komutuyla ulaşabiliriz. Şekil – 2’de kendi topic’lerimizle birlikte alt çizgiyle başlayan Kafka’nın kullandığı topic’leri de görüyoruz.
kafka-topics --list --bootstrap-server localhost:9092
Oluşturduğumuz topic’in özelliklerine describe komutu ile ulaşabiliriz. kitap topic’ini yaratırken partition sayısını 3 olarak belirlediğimiz için Şekil – 3’de 0, 1 ve 2 olarak oluşturulan 3 partition görüyoruz. replication-factor sayımızı 1 olarak belirlediğimiz için tek bir broker vardır, dolayısıyla tüm partitionlar için leader, replica’lar ve leader’in senkronize replica’ları olan Isr’ler aynı sunucu üzerindedir. (1001 id’li broker)
kafka-topics --describe --bootstrap-server localhost:9092 --topic kitap
2 – Kafka Producer
Örneğimiz için kitap topic’ine mesaj gönderecek bir console-producer oluşturuyoruz. Daha sonra Şekil – 4’deki gibi tek tek kitap isimleri giriyoruz.
kafka-console-producer --broker-list localhost:9092 --topic kitap
2 – Kafka Consumer
Producer’da en son Satranç’ı girdikten sonra Şekil – 5’de görüldüğü gibi producer penceresini kapatmadan sağ tarafına yeni bir komut penceresi açarak kitap topic’ine abone (subscribe) olan bir console-consumer oluşturuyoruz. Ancak daha önce oluşturduğumuz (Şekil – 4’deki) kitaplar consumer penceresinde görünmüyor. Consumer dinlerken producer’dan eklediğimiz yeni kitaplar (Satranç’tan sonrakiler) consumer penceresinde görünüyor.
kafka-console-consumer --bootstrap-server localhost:9092 --topic kitap
Topic’de en başından beri bulunan tüm verilere ulaşmamız gerekirse –from-beginning komutunu kullanırız. Şekil – 6’da consumer’da –from-beginning ile tüm verilerin çekildiği görülebilir. Ancak dikkatinizi çekmiş olmalı, consumer’da çekilen veriler, Şekil – 4’deki producer ile gönderilen sıradan farklı bir sıradadır. Eğer topic’i oluştururken partition sayısını 1 girseydik verilere yine sıralı bir şekilde erişebilirdik. Kafka aynı partition içinde verilerin sıralı olması garantisini verir. Ancak partition sayımız 1’den fazla olduğu için Kafka verileri iş yükünü dengelemek için verileri partition’lara dağıtık bir şekilde göndermiştir ve verilerimize sıralı bir şekilde erişme imkanımız kalmamıştır.
kafka-console-consumer --bootstrap-server localhost:9092 --topic kitap --from-beginning
2 – Kafka Consumer Group
Consumer’lar verileri gruplar halinde okur. Grupları bir uygulama gibi düşünebiliriz. Mesela kitap topic’imizi hem e-ticaret sitemiz hem de mobil uygulamamız okuyor olabilir. Consumer group sayesinde iki farklı gruptaki consumer’lar birbirlerini etkilemeden çalışabilir. Şekil – 7’de sağda producer’ımız, solda o producer’dan beslenen aynı gruba ait olan iki farklı consumer görülmektedir. Producer’dan girdiğimiz veriler aynı gruptaki iki consumer’a paralel olarak paylaştırılmaktadır. Veriler consumer’lara belli bir sıraya göre değil yük durumuna göre dağıtılır.
kafka-console-consumer --bootstrap-server localhost:9092 --topic kitap --group mobil-uygulama
Yeni bir komut penceresinde aynı gruba ait 3. bir consumer oluşturursak (aynı komutla), Şekil – 8’deki gibi üç consumer arasında yük dağılımı yeniden yapılır. Bu durumda üç partition ve üç consumer olduğu için her consumer veriyi farklı bir partition’dan okur. Şekil – 8’de görüldüğü gibi belli bir süre sonra en üstteki consumer’ı ctrl+c ile kapatıp producer’dan veri girmeye devam edersek, yükün geri kalan iki consumer tarafından yeniden paylaşıldığını görebiliriz. Bu durumda aktif olan iki consumer veriyi almaya devam edecektir.
Consumer gruplarımızı describe komutu ile Şekil – 9’daki gibi tanımlayabiliriz. Belli bir partition’da current-offset consumer’ın en son okuduğu verinin offset’ini (id’sini) log-end-offset ise o partition’daki son verinin offset’ini gösterir. Consumer’larımız tüm verileri okuduğu için current-offset ve log-end-offset’leri aynıdır. Bunlar arasında fark olsaydı, Lag biriken bu farkı yani okunmayan veri sayısını gösterecekti. Consumer grubumuzda okunmamış veri olmadığı için gruba yeni bir consumer eklersek ve –from-beginning ile tüm verileri okumasını istersek geriye dönecek veri olmayacaktır. Çünkü –from-beginning o grup içinde okunmamış verileri getirmektedir. En baştan tüm verileri çağırmak istiyorsak bu offset’leri resetleyecek ileri seviye teknikler mevcuttur.
kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group mobil-uygulama
Bu yazıda Apache Kafka’yla ilgili kavramların daha iyi pekişmesini sağlamak amacıyla komut satırı kullanarak örnekler yaptık. Gerçek hayat projelerinde Kafka Java gibi programlama dilleri ile kullanılmaktadır. Daha sonraki uygulama yazılarımda bir programlama diliyle Kafka uygulaması yapmayı planlıyorum.
Yeni yazılarda görüşmek ümidiyle.
Teşekkürler, Kafka yazı seriniz çok verimli oldu.
Faydalı olmasına sevindim 🙂