Merhabalar,
Kafka serimize devam ediyoruz. Geçen hafta Kafka kurulumunu yaptık. Kurulum adımları için https://asiyeyigit.com/apache-Kafka-kraft-modunda-kurulum makalemizi inceleyebilirsiniz. Geçen hafta kurulum yaptığımız ortamımızı kontrol edelim. Kafka’yı başlattık ve servislerin çalıştığını gözlemledik.
Node 1:
ubuntu@instance-20250309-1117:~$ /opt/Kafka/bin/Kafka-server-start.sh -daemon /opt/Kafka/config/kraft/server.properties
ubuntu@instance-20250309-1117:~$ ss -tulnp | grep java
tcp LISTEN 0 50 *:9093 *:* users:((“java”,pid=1708,fd=146))
tcp LISTEN 0 50 *:9092 *:* users:((“java”,pid=1708,fd=174))
tcp LISTEN 0 50 *:38443 *:* users:((“java”,pid=1708,fd=127))
ubuntu@instance-20250309-1117:~$
Node 2:
ubuntu@instance-20250309-1132:~$ /opt/Kafka/bin/Kafka-server-start.sh -daemon /opt/Kafka/config/kraft/server.properties
ubuntu@instance-20250309-1132:~$ ss -tulnp | grep java
tcp LISTEN 0 50 *:35191 *:* users:((“java”,pid=1714,fd=127))
tcp LISTEN 0 50 *:9092 *:* users:((“java”,pid=1714,fd=178))
tcp LISTEN 0 50 *:9093 *:* users:((“java”,pid=1714,fd=148))
ubuntu@instance-20250309-1132:~$
Node 3:
ubuntu@instance-20250309-1137:~$ /opt/Kafka/bin/Kafka-server-start.sh -daemon /opt/Kafka/config/kraft/server.properties
ubuntu@instance-20250309-1137:~$ ss -tulnp | grep java
tcp LISTEN 0 50 *:43531 *:* users:((“java”,pid=2005,fd=127))
tcp LISTEN 0 50 *:9093 *:* users:((“java”,pid=2005,fd=147))
tcp LISTEN 0 50 *:9092 *:* users:((“java”,pid=2005,fd=174))
ubuntu@instance-20250309-1137:~$
Şimdi “Topic” kavramını detaylandıralım. “Topic”, mesajların mantıksal bir kategoride gruplandığı yerdir. Mesajları anlamlandırmak ve düzenlemek için kullanılır. Bir yazar olarak, kitapçıdaki farklı türlere ayrılmış rafları hayal edeceğim. Bilim kurgu kitaplar rafı, fantastik kitaplar rafı, romans kitaplar rafı. Kafka’da veriler belirli başlıklar altında toplanır. Bu başlıklar, örneğimizde raflar, “topic” olarak isimlendirilir. “Producer”lar (üreticiler) “topic”lere mesaj gönderir. “Consumer”lar (tüketiciler) bu “topic”leri dinleyerek mesajları alır.
“science-fiction-books topic”ine gelen mesajlar, farklı “partition”lara dağıtılarak paralel akış sağlanabilir. Bilim kurgu kitaplar için “science-fiction-books topic”ini, fantastik kitaplar için “fantasy-books topic”ini, romans kitapları için “romance-books topic” lerini oluşturabiliriz.
Bir yazar yeni bir bilim kurgu kitabı yazdığında, Kafka örneğin “science-fiction-books” adlı “topic”e bu kitabı gönderir. Bilim kurgu okurları (“consumer”lar) bu “topic”i dinleyerek yeni kitap bilgilerini alır. Kafka’da “topic”le mesajlar kategorize edilir. Yani veriler konularına göre ayrılır. Örneğin, bilim kurgu ile ilgili mesajlar “science-fiction-books topic”inde tutulur, karışmaz. “Topic”, farklı tüketicilerin (“consumer”) ilgili verileri okumasını sağlar. Bilim kurgu okurları, sadece bilim kurgu kitaplarını içeren “topic”i dinleyebilir. Fantastik kitap meraklıları, sadece fantastik kitapları içeren “topic”e abone olabilir. Elbette “topic”ler, veri kaybını önler ve performansı artırır. Çünkü, Kafka’da her “topic” bölümlere (“partition”) ayrılarak verinin daha hızlı akmasını sağlar. “Topic”leri, “partition”lara bölerek paralel tüketimi sağlayabiliriz. Aşağıda olan tablo, “partition” kavramının simülasyonunu gösteriyor.

Kafka’da her partition’ın bir “Leader” (Lider) “node”u bulunur ve tüm okuma-yazma işlemleri bu lider üzerinden gerçekleştirilir. Diğer “node”lar ise “Replica” (Yedek) olarak çalışarak liderin verisini saklar ve sürekli senkronize olur. Tüketiciler (“Consumer”lar), yalnızca lider “partition”dan veri okuyabilir ve replikalar yalnızca veri yedeği olarak görev yapar. Eğer lider “node” çökerse, Kafka otomatik olarak senkronize olan replikalar arasından yeni bir lider seçerek sistemin kesintisiz çalışmasını sağlar.
“Replication Factor”ün üç olduğunu düşünelim. Acaba bu durumda tablomuz nasıl olur?

“Topic”ler, üç “node”a, “partition” ve “replication factor” değerleri dikkate alınarak dağıtılmış oldu. Şimdi bu değerlerle “topic”leri oluşturalım.
“science-fiction-books “ için çalıştıracağımız komut:
“/opt/kafka/bin/kafka-topics.sh –create \
–topic science-fiction-books \
–bootstrap-server 10.0.0.25:9092,10.0.0.239:9092,10.0.0.33:9092 \
–partitions 3 \
–replication-factor 3”
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-topics.sh –create \
–topic science-fiction-books \
–bootstrap-server 10.0.0.25:9092,10.0.0.239:9092,10.0.0.33:9092 \
–partitions 3 \
–replication-factor 3
Created topic science-fiction-books.
ubuntu@instance-20250309-1117:~$
“fantasy-books” için çalıştıracağımız komut:
/opt/kafka/bin/kafka-topics.sh –create \
–topic fantasy-books \
–bootstrap-server 10.0.0.25:9092,10.0.0.239:9092,10.0.0.33:9092 \
–partitions 3 \
–replication-factor 3
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-topics.sh –create \
–topic fantasy-books \
–bootstrap-server 10.0.0.25:9092,10.0.0.239:9092,10.0.0.33:9092 \
–partitions 3 \
–replication-factor 3
Created topic fantasy-books.
ubuntu@instance-20250309-1117:~$
“romance-books” için çalıştıracağımız komut:
/opt/kafka/bin/kafka-topics.sh –create \
–topic romance-books \
–bootstrap-server 10.0.0.25:9092,10.0.0.239:9092,10.0.0.33:9092 \
–partitions 3 \
–replication-factor 3
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-topics.sh –create \
–topic romance-books \
–bootstrap-server 10.0.0.25:9092,10.0.0.239:9092,10.0.0.33:9092 \
–partitions 3 \
–replication-factor 3
Created topic romance-books.
ubuntu@instance-20250309-1117:~$
Oluşturduğumuz “topic”leri aşağıdaki gibi listeledik. “/opt/kafka/bin/kafka-topics.sh –list –bootstrap-server 10.0.0.25:9092” komutunu çalıştırdık.
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-topics.sh –list –bootstrap-server 10.0.0.25:9092
fantasy-books
romance-books
science-fiction-books
ubuntu@instance-20250309-1117:~$
Her “topic” için “partition” ve “replication” bilgilerini aşağıda doğruladık.
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-topics.sh –describe –topic science-fiction-books –bootstrap-server 10.0.0.25:9092
Topic: science-fiction-books TopicId: QanK6eYhTceEYgGeZgKjRA PartitionCount: 3 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: science-fiction-books Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3 Elr: LastKnownElr:
Topic: science-fiction-books Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1 Elr: LastKnownElr:
Topic: science-fiction-books Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2 Elr: LastKnownElr:
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-topics.sh –describe –topic fantasy-books –bootstrap-server 10.0.0.25:9092
Topic: fantasy-books TopicId: hk9sQGU1RBWVa1lDpChMJQ PartitionCount: 3 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: fantasy-books Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3 Elr: LastKnownElr:
Topic: fantasy-books Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1 Elr: LastKnownElr:
Topic: fantasy-books Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2 Elr: LastKnownElr:
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-topics.sh –describe –topic romance-books –bootstrap-server 10.0.0.25:9092
Topic: romance-books TopicId: eeKqPZC3TRSQbo9iUfDKHA PartitionCount: 3 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: romance-books Partition: 0 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2 Elr: LastKnownElr:
Topic: romance-books Partition: 1 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3 Elr: LastKnownElr:
Topic: romance-books Partition: 2 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1 Elr: LastKnownElr:
ubuntu@instance-20250309-1117:~$
Şu ana kadar neler yaptık? Kafka yapılandırmamızı başarıyla tamamladık ve oluşturduğumuz science-fiction-books, fantasy-books ve romance-books adlı topic’lerin doğru bir şekilde çalıştığını doğruladık. Her topic’in 3 “partition” ve 3 “replication factor” ile üç “node”a dengeli bir şekilde dağıtıldığını gördük. “–list” komutu ile topic’lerin eksiksiz olarak oluşturulduğunu teyit ettik, ardından
“–describe” komutuyla “partition” ve “replication” bilgilerini detaylıca inceledik. Kafka’nın yük dengeleme mekanizması sayesinde her node’un en az bir “partition” için lider olarak atandığını ve replikaların senkronize çalıştığını gözlemledik. “ISR (In-Sync Replicas)” listesinde tüm node’ların bulunması, replikaların güncel ve sağlıklı olduğunu gösteriyor. Böylece, Kafka’nın otomatik yük dengeleme ve replikasyon mekanizmalarının beklendiği gibi çalıştığını doğrulamış olduk. Kitaplığımızda, “topic” başlıklarıyla içleri boş raflarımızı hazır ettik. Raflarımızı “partition”larla bölmelere ayırdık. Şimdi, rafların bölmelerine kitaplarımızı yerleştireceğiz, yani mesajlarımız ileteceğiz.
Kafka’yı bir kitaplık gibi düşünmek, “topic”, “partition” ve mesaj kavramlarını anlamak için faydalı olabilir. “Topic”ler, kitaplıktaki raflar gibi verileri belirli kategorilere ayırırken, partition’lar bu rafların bölmelere ayrılmasını sağlar. Mesajlar ise raflara yerleştirilen kitaplar gibi düşünülebilir. Bu analoji, Kafka’nın mesaj akışını kavramsal olarak anlatır. İlk olarak, kitaplığımızı oluşturduk ve “topic”leri tanımlayarak boş raflarımızı hazırladık. Daha sonra, rafları “partition”larla bölmelere ayırarak verinin düzenli bir şekilde dağıtılmasını sağladık. Şimdi ise, Kafka “producer” kullanarak kitapları yerleştiriyor, yani mesajları gönderiyoruz ve raflarımızı doldurmaya başlıyoruz.
Aşağıdaki şekilde “Kafka Producer” ile kitapları “topic”lere ekledik.
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-producer.sh –broker-list 10.0.0.25:9092 –topic science-fiction-books
>Jules Verne – Dunyanin Merkezine Seyahat
>H.G. Wells – The Time Machine
>Isaac Asimov – Vakif
^Cubuntu@instance-20250309-1117:~$
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-producer.sh –broker-list 10.0.0.25:9092 –topic fantasy-books
>J.R.R. Tolkein – Yuzuklerin Efendisi
>J.K. Rowling – Harry Potter
>Sarav Asiye Yigit – Zulfanur & Ahlashan
^Cubuntu@instance-20250309-1117:~$
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-producer.sh –broker-list 10.0.0.25:9092 –topic romance-books
>Jane Austen – Gurur ve Onyargi
>Nicholas Spark – Not Defteri
>Emily Bronte – Uğultulu Tepeler
^Cubuntu@instance-20250309-1117:~$
Şimdi “Kafka Consumer” kullanarak mesajları okuyalım.
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-consumer.sh –bootstrap-server 10.0.0.25:9092 –topic science-fiction-books –from-beginning
Jules Verne – Dunyanin Merkezine Seyahat
H.G. Wells – The Time Machine
Isaac Asimov – Vakif
^CProcessed a total of 3 messages
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-consumer.sh –bootstrap-server 10.0.0.25:9092 –topic fantasy-books –from-beginning
Sarav Asiye Yigit – Zulfanur & Ahlashan
J.R.R. Tolkein – Yuzuklerin Efendisi
J.K. Rowling – Harry Potter
^CProcessed a total of 3 messages
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-consumer.sh –bootstrap-server 10.0.0.25:9092 –topic romance-books –from-beginning
Jane Austen – Gurur ve Onyargi
Nicholas Spark – Not Defteri
Emily Bronte – Uğultulu Tepeler
^CProcessed a total of 3 messages
ubuntu@instance-20250309-1117:~$
Kafka üzerinden mesajları başarıyla gönderdik ve tüketicilerle okuduk. Öncelikle, “topic”leri oluşturarak her biri için “partition” ve “replication” yapılarını belirledik. Ardından, “Kafka Producer” kullanarak kitapları mesaj olarak ekleyip “topic”leri doldurduk. Daha sonra, “Kafka Consumer” ile mesajları okuyarak tüm verilerin eksiksiz bir şekilde iletildiğini doğruladık. Son olarak, her “topic”te toplamda üç mesajın işlendiğini gösteren “Processed a total of 3 messages” çıktısını aldık. Şu an tüm mesajlar Kafka’da eksiksiz bir şekilde işlendi ve tüketildi.
Şimdi ise “Kafka Consumer” bir web servisi yazalım. Bu amaç ile aşağıdaki Rocky Linux makinesini kullanacağım.
[rocky@instance-20241019-1038 ~]$ uname -a
Linux instance-20241019-1038 5.14.0-503.14.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Nov 15 12:04:32 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
[rocky@instance-20241019-1038 ~]$
Aşağıdaki gibi Python ve gerekli kütüphaneleri kurduk.

Bu adımlarda, öncelikle Python 3 ve pip yükleyerek sistemde Python paketlerini yönetmek için gerekli ortamı hazırlıyoruz. Ardından, Flask web framework’ünü kurarak basit ve hızlı bir web servisi geliştirebilmemizi sağlıyoruz. Son olarak, Kafka ile bağlantı kurabilmek için Confluent Kafka Client kütüphanesini yükleyerek, web servisini Kafka’dan mesaj okuyabilen bir tüketici (“consumer”) haline getiriyoruz. “kafka_web_consumer.py” python kodumuzu oluşturalım.
[rocky@instance-20241019-1038 ~]$ vi kafka_web_consumer.py
[rocky@instance-20241019-1038 ~]$

Uygun şekilde python kodu oluşturarak yukarda olan komutlar sonrası, Flask Web servisinin başarıyla çalıştığını görüyoruz.
[rocky@instance-20241019-1038 ~]$ curl http://130.61.119.59:5000/consume
{“messages”:[“H.G. Wells – The Time Machine”,”Isaac Asimov – Vakif”,”Jules Verne – Dunyanin Merkezine Seyahat”]}
[rocky@instance-20241019-1038 ~]$ curl http://130.61.119.59:5000/consume
{“messages”:[]}
[rocky@instance-20241019-1038 ~]$
Kafka mesajlarını tüketmek için bir Flask tabanlı web servisi geliştirdik. API ilk çağrıldığında, Kafka’daki mevcut mesajları başarıyla okudu ve JSON formatında istemciye iletti. Ancak Kafka’nın offset mekanizması gereği, mesajlar bir tüketici tarafından alındığında tekrar okunmaz. Bu yüzden, aynı API tekrar çağrıldığında Kafka’da yeni mesaj eklenmemişse, tüketilecek mesaj bulunmadığından boş bir yanıt döner. Bu durum, mesajların Kafka’dan silindiği anlamına gelmez. Mesajlar hala Kafka’da saklanmaktadır.
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-consumer.sh –bootstrap-server 10.0.0.25:9092 –topic science-fiction-books –from-beginning
H.G. Wells – The Time Machine
Isaac Asimov – Vakif
Jules Verne – Dunyanin Merkezine Seyahat
Processed a total of 3 messages
ubuntu@instance-20250309-1117:~$
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-consumer.sh –bootstrap-server 10.0.0.25:9092 –topic fantasy-books –from-beginning
J.K. Rowling – Harry Potter
Sarav Asiye Yigit – Zulfanur & Ahlashan
J.R.R. Tolkien – Yuzuklerin Efendisi
Processed a total of 3 messages
ubuntu@instance-20250309-1117:~$
ubuntu@instance-20250309-1117:~$ /opt/kafka/bin/kafka-console-consumer.sh –bootstrap-server 10.0.0.25:9092 –topic romance-books –from-beginning
Jane Austen – Gurur ve Onyargi
Nicholas Sparks – Not Defteri
Emily Bronte – Ugultulu Tepeler
Processed a total of 3 messages
ubuntu@instance-20250309-1117:~$
Sarav Asiye Yiğit – 15 Mart 2025 Cumartesi






Yorumunuzu Bırakın