.NET 7 ile Apache Kafka bağlantısı

Tajdin Arat
inventiv
Published in
5 min readJan 6, 2023

Bu makalede Kafka’yı inceleyecek, RabbitMQ ile farklarına değindikten sonra dotNET 7 ile örnek bir uygulama geliştireceğiz. İyi okumalar…

Apache Kafka

Kafka yüksek girişli veri tekrarı ve akışları için geliştirilmiş, çoğaltma, bölümleme, hata toleransı ve daha iyi aktarım hızı için yerleşik desteğe sahip bir yayınlama/abone olma mesajlaşma platformudur.

Büyük ölçekli veri işlemeye ihtiyaç duyan uygulamalar için çok iyi bir seçim olan Kafka, esas olarak gerçek zamanlı veri hatları oluşturmak için kullanılır.

Neden Kafka kullanılmalı?

Esneklik : Apache Kafka yüksek derecede ölçeklenebilen bir uygulamadır. Topic’leri bölümlere ayırarak yüksek performanslı okuma yazma işlemleri yapabilir ve esneyebilir. Bu sayede Kafka, birden çok üreticinin (producer) ve tüketicinin (consumer) aynı anda okuma/yazma işlemleri yapmasını sağlar.

Veriyolu Genişliği : Apache Kafka anlık olarak yüksek derecede veri akışını yönetebilir.

Güvenilirlik : Apache Kafka hataya dayanıklı ve hata durumunda toparlanma konusunda usta bir mesajlaşma sistemidir.

Apache Kafka, mesajlar tüketildikten sonra dahi bir süre mesajları korur. Bu sayede üretici ve tüketici farklı anlarda işlem yapabilirken, aynı zamanda hata toleransını ve esnekliği sağlar.

Kafka ve Benzer Mesajlaşma Uygulamaları Arasındaki Farklar

Kafka diğer mesajlaşma uygulamalarına kıyasla mesajları koruyan bir yapıya sahiptir, bu sayede tüketici (consumer) online olmasa dahi mesajlar kaybolmaz.

Kafka mesaj konularını parçalara böldüğü için hızlı bir şekilde veri iletebilir ve diğer uygulamalara göre daha ölçeklenebilirdir.

Kafka cursor’un queue’daki konumunun tüketici üzerinde tutulması prensibiyle çalışır.

Şimdi daha kolay anlayabilmek için alandaki popüler uygulamalardan biri olan RabbitMQ ile karşılaştırma yapalım.

RabbitMQ

RabbitMQ yüksek verimli ve güvenilir arkaplan işlemleri için kullanılabilir. Oldukça büyük veri iletim kapasitesi sunarken, aynı zamanda mesaj iletiminin doğrulanması gereksinimi ile güvenilirliği sağlar.

Genel olarak uygulamalar içerisinde ve arasındaki entegrasyonlar, güvenilirlik garantisi gerektiren arkaplan işlemleri ve uzun süreli görevlerde kullanılabilir.

Kafka vs RabbitMQ

  • Kafka üzerinde mesajlar üreticiler tarafından yayınlanır (publish) ve tüketiciler tarafından abone olunarak (subscribe) tüketilebilir. RabbitMQ ise mesajların transaction şeklinde iletilmesini sağlayarak güvenilirliği sağlamaya çalışır. Bunu, tüketiciye gönderilen mesajlardan acknowledge bilgisi bekleyerek uygular.
    Yani Kafka dumb broker/smart consumer ; RabbitMQ smart broker/ dumb consumer mantığı ile çalışır.
  • Kafka’da cursorun pozisyon bilgisi tüketici (consumer) tarafında iken (consumer-centric) ; RabbitMQ’da cursor bilgisi broker tarafında tutulur. (broker-centric)
  • Kafka pull-based çalışır. Yani consumer pull isteği atmasını bekler. Pull isteği atılmasında tüketici taraflı gecikme veya çökme yaşansa dahi tüketici daha sonra istediği/kaldığı yerden devam edebilir.
    RabbitMQ ise push-based çalışır. Yani mesajlar üretici tarafından geldiği gibi tüketici tarafına gönderilir. Burada tüketicinin gecikme veya çökme yaşaması durumunda istek/mesaj bekleme durumuna alınır.

Kafka Mimarisi

Üretici ve tüketici arasındaki iletişim aşamasının basit bir şeması

Kafka Broker: Bir mesaj aracısı (message-broker) producer ve consumer arasındaki aracı görevini görür ve iletişimi sağlar. Aynı Kafka kümesinde yer alan broker’lar her saniye birden çok mesaj alış-verişini üstlenebilir. Bu senaryoda üretici ve tüketici doğrudan iletişim kurmadığı için, taraflardan biri çökse dahi iletişim kopmadan devam edebilir.

Kafka Producer: Üretici (producer) bir veya birden fazla topic üzerindeki mesajların yazılması, yayınlanması ve yönetilmesini sağlayan taraftır.

Kafka Consumer: Tüketici (consumer) abone olunan topicler üzerindeki mesajları tüketen, belirli tüketici gruplarına dahil olan taraftır. Kafka tarafından gönderilen mesajlar bir topic üzerindeki tüketici gruplarının her birine ulaştırılır.

Kafka Topic : Topic veri iletimi için kanal tanımlar. Üreticiler bu kanallara mesajları yayınlar, tüketiciler ise bu kanallardaki mesajları okurlar. Cluster üzerinde oluşturulabilecek topic sayısında bir sınır yoktur ve her bir benzersiz isim cluster üzerindeki topic’i tanımlar.

Kafka Cluster : Cluster bir veya birden çok sunucuyu Kafka brokerlarına açan bir yapıdır. Her cluster (küme) kelime anlamından da anlaşılabileceği gibi birden çok message-broker (mesaj aracısı) içerir. Küme durumunu yönetmek için ZooKeeper kullanılır.

Kafka ZooKeeper : ZooKeeper kümedeki brokerları yönetir. Ayrıca producer ve consumer’lara yeni broker bilgisi veya broker’ların hata durumlarının iletilmesinden sorumludur.

Kafka Use-Case’leri

Veri Etkinliği İzleme
Kafka ile web sitesi etkinliği gözlemleme, çeşitli IoT cihazlarından veri toplama, hastanelerdeki hastaları gözlemleme vb. yüksek hacimli etkinlik takiplerini gerçekleştirebilirsiniz.

Yayın İşleme
Birkaç dakika süren bir yayın sırasındaki ortalama bir değeri gözlemleme veya yayın süresinde tetiklenen etkinliklerin sayılarını veya türlerini kaydetme gibi olay akışına dayalı işlemlerde Kafka kullanılabilir.

İşlem Geçmişi Oluşturma
Kafka, gözlemlenmek istenen bakiye gösterim durumundaki bozulma sonrasında işlem geçmişi kayıtlarıyla bakiyeyi tekrar hesaplayıp, doğru bakiyeyi gösterme işlemi için kullanılabilir. Kafka, bir uygulamanın durum değişikliğini işlem geçmişi şeklinde saklayabilir.

Günlük Toplama
Kafka kayıt günlüklerini toplama ve depolamada kullanılabilir.

Kurulum ve Çalıştırma

docker pull bitnami/kafka

Daha detaylı bilgi için bu adresi ziyaret edebilirsiniz : https://hub.docker.com/r/bitnami/kafka

Kafka’ya bağlanmak için NuGet’in Confluent.Kafka paketi kullanıldı.

Üretici ve tüketici olmak üzere iki servis oluşturulduktan sonra üretici taraftan bir mesaj gönderilir ve tüketici taraftan bu mesaj alınır.

ProducerService.cs

ConsumerService.cs

docker-compose.yml

Program.cs

Çıktı :

Programın kaynak koduna bu linkten erişebilirsiniz : https://github.com/alikrc/KafkaConsoleApp

Bitirirken…

Bu yazımızda Docker ile Apache Kafka’yı dotNET 7 konsol uygulaması üzerinde kullandık. Okuduğunuz için teşekkürler.

Bu makalenin hazırlanmasındaki katkılarından dolayı Ali Karaca ve Sefa Akşit ‘e teşekkürlerimi sunarım.

--

--