Sistemler arası haberleşmede eğer bir istemci ve bir kaynak varsa burada normal işlemleri uygulayarak haberleşme sağlanabilir. Ancak iki taraflı iletişimi çoklu iletişime çevirmek istersek burada farklı bir çözüm getirmek gerekir. Bunu eğer tüm istemci ve kaynaklar için ayrı ayrı oluşturmaya kalkarsak çok karmaşık bir yapı oluşacaktır. Tam bu noktada Apache Kafka ile çözüme ulaşabiliyoruz. Kısaca Apache Kafka için Pub-Sub tabanlı mesajlaşma sistemi diyebiliriz.
Apache Kafka bu işlemleri gerçekleştirirken protokollerden bağımsız (HTTP,TCP,FTP …) olarak hareket eder ve bunlarla birlikte gelişebilecek birçok problemin de önüne geçmiş olur.
Bu tür iletişim sağlayan diğer bir yazılım ise RabbitMQ’dur. RabbitMQ’da açık kaynak olarak kullanılan bir mesaj kuyruk sistemidir.
İlk olarak Apache Kafka içerisinde bulunan bileşenlerden bahsederek başlayalım,
Topic : Mesajların saklandığı kategorilere denir. Bunu veri tabanlarında bulunan tablolara benzetebiliriz.
Partition : Topic içerisinde bulunan bölümlere verilen isimdir. Partition yapıları kendilerine ait bir numara içerir ve bu numaralar 0’dan başlar.
Offset : Partition içerisinde yer alan ve 0’dan başlayan numaralar bu yapıların kimlik değerleri gibidir ve artarak ilerler. Bu değelere de offset denir.
Kafka üzerinde eklenen mesajlar eğer herhangi bir değer verilmezse default değer olarak 1 hafta saklanırlar. Aynı şekilde partition içinde eğer bir değer verilmemişse rastgele şekilde mesaj yazılır.
Burada dikkat edilmesi gereken noktalardan biri de Partition’ların ayrı olarak düşünülmesidir. Partition 0’da 6. offset değeri ile Partition 3’deki 6. offset kıyaslanamaz. Hangisi önce eklenmiştir bilemeyiz.
Ancak şunu bilmeliyiz ki her partition kendi içinde bir sıralamaya sahiptir. Yani az önce bahsettiğimiz kıyaslama kendi içerisinde mevcuttur. Partition 1’in 3. Offset’i ile Partition 1’in 5. Offset’i içerisindeki veriler eklenme sırasına göre karşılaştırılabilir. Burada 3. Offset 5. Offset’ten önce eklenmiştir.
Burada örnek çoklu partition kullanılan topic’ler için geçerlidir. Partition sayısı 1 olan sistemler farklı şekilde değerlendirilir. Eğer Key değeri ile partition içerisine veri yazılırsa buna daha sonradan ulaşma imkanı da bulmuş oluruz.

BROKER : Bir kafka sunucuna broker adı verilir. Broker yapıları Kafka Cluster’ı oluşturur. Broker’lar kendilerine ait Id bilgisi içerir. Bu broker yapılarından bir tanesi lider olarak atanır ve okuma-yazma işlemleri bu broker üzerinden devam eder. Eğer lider olarak atanan node çalışmazsa diğerlerinden birisi lider olarak işlemleri devam ettirir.
PRODUCER : Topic içerisine mesaj yollayan bileşendir ve Pub-Sub yapısında Publisher konumundadır.
Burada veri gönderilirken key ile veya key olmadan iki farklı şekilde veri gönderilebilir. Bu key değeri string,number… olabilir. Eğer key değeri olmazsa veriler load balancing ile round robin yöntemiyle gönderilecektir. Bundan dolayı sıralı şekilde veriye ulaşamayız. Örneğin 5 adet broker varsa burada önce 1. sonra 2. ve 3. olmak üzere bu şekilde devam eder ve döngü tamamlanınca tekrar başa döner.
CONSUMER : Topic’e yazılan verileri okuma işlemi gerçekleştirir. Bu okuma işlemi ise yukarıda da bahsettiğimiz partition offset numara sırasına göre gerçekleşir. Ancak birden fazla partition’dan okumadan bahsedersek burada belirli bir sıradan bahsedemeyiz. Yani birinde 2. offset diğerinde 20. offset’ten okuma yapabilir.
Burada dikkat edilmesi gereken nokta ‘Consumer Group’ kavramıdır. Birtane consumer dahi olsa burada bir consumer group vardır. Biz oluşturmasak dahi Kafka otomatik olarak bir consumer group oluşturacaktır.
Yukarıda da görüldüğü üzere consumer group içerisinde 2 adet consumer bulunmaktadır. Burada yük ikiye bölünmüştür ve performas artışı da bununla sağlanmıştır.
Topic Replication : Bu bir topic’in çalışmaması halinde alternatif bir bileşene geçme durumu olarak tanımlanabilir. ‘Replication Factor’ ise Kafka Cluster içerisindeki bir topic’in kaç adet kopyasının bulunacağını belirtir. Bu kopyalar Kafka Broker’lar arasında eşit şekilde dağıtılır.
