Kafka ve RabitMQ nedir ne için kullanılır.

Kafka ve RabitMQ  nedir ne için kullanılır.

Veri Trafiğinin Mimarları: Kafka ve RabbitMQ Nedir, Hangisini Seçmeli?

Selamlar! Bugün yazılım dünyasının “postacıları” diyebileceğimiz, sistemlerimizin birbirleriyle haberleşmesini sağlayan iki dev ismi masaya yatırıyoruz: Apache Kafka ve RabbitMQ .

Eğer mikroservis mimarileriyle ilgileniyorsan veya “sistemim neden bu kadar yavaşladı?” diye düşünüyorsan, bu yazı tam sana göre. Hazırsan, çayını kahveni al ve bu iki devin dünyasına dalalım!

Mesaj Kuyruğu (Message Broker) Nedir? Neden Lazım?

Önce temelden başlayalım. İki servisimiz olsun: Biri siparişleri alan Sipariş Servisi , diğeri ise fatura kesen Fatura Servisi . Sipariş servisi faturayı beklerse sistem yavaşlar. Bunun yerine Sipariş servisi, “Bir sipariş geldi!” notunu bir kutuya bırakır ve işine devam eder. Fatura servisi de o kutudan notu alır ve faturayı keser. İşte bu “kutu”, mesaj kuyruğu sistemidir.

### 1. RabbitMQ: Klasik ve Akıllı Postacı

RabbitMQ, dünyanın en popüler açık kaynaklı mesaj yönlendiricisidir. Onu bir postane gibi düşünebilirsin.

* Nasıl Çalışır? Mesajı alır, doğru adrese (kuyruğa) yönlendirir ve alıcı (consumer) mesajı aldığında o mesajı siler.
* Öne Çıkan Özelliği: “Akıllı Broker, Saf Alıcı” mantığıyla çalışır. Mesajın nereye gideceğine RabbitMQ karar verir.
* Ne Zaman Kullanılır?
* Hızlıca bir işin arka planda yapılması gerekiyorsa.
* Karmaşık yönlendirme kurallarına (routing) ihtiyacın varsa.
* Mesajın ulaştığından emin olmak (acknowledgment) kritikse.

### 2. Apache Kafka: Dijital Bir Kütüphane ve Kayıt Cihazı

Kafka ise sadece bir mesaj kuyruğu değil, bir dağıtık olay akış platformudur (Event Streaming Platform) . Onu hiç durmadan yazan bir günlük defterine (log) benzetebiliriz.

* Nasıl Çalışır? Mesajları (eventleri) sırayla disk üzerine yazar. Mesajlar okunduğunda silinmez, belirli bir süre (örneğin 7 gün) orada kalır.
* Öne Çıkan Özelliği: “Saf Broker, Akıllı Alıcı”. Kafka mesajı sadece yazar, alıcı hangi mesajda kaldığını kendisi takip eder.
* Ne Zaman Kullanılır?
* Çok yüksek veri trafiği (Big Data) varsa.
* Aynı veriyi birden fazla servisin farklı zamanlarda okuması gerekiyorsa.
* Geçmişe dönük verileri tekrar okuman (Replay) gerekiyorsa (Örn: Finansal işlemler, log analizi).

### Kafka vs RabbitMQ: Hangisi Daha İyi?

Aslında “hangisi daha iyi” değil, “hangisi senin ihtiyacına uygun” sorusu önemli.

Özellik RabbitMQ (Akıllı Postacı) Apache Kafka (Devasa Günlük)
Ana Felsefe Mesajın doğru yere gidip işlendiğinden emin olmak. Büyük miktarda veriyi sırayla depolamak ve erişime açmak.
Veri Akışı Push (İtme): Broker, tüketiciye gönderir. Pull (Çekme): Tüketici, broker’dan ister.
Yönlendirme (Routing) Çok Güçlü ve Karmaşık. Basit (Sadece Topic bazlı).
Performans Hedefi Düşük Gecikme (Low Latency). Yüksek Veri Hacmi (High Throughput).
Mesaj Ömrü Genellikle işlenince silinir. Belirli bir süre (günler/haftalar) diskte saklanır.
Tüketici Durumu Broker takip eder (Kim neyi aldı). Tüketici kendi takip eder (Offset).
Tekrar Oynatma Zordur (Genellikle yapılamaz). Çok Kolaydır (Tasarım amacı budur).
İdeal Kullanım Mikroservisler arası karmaşık iletişim, arka plan iş kuyrukları. Büyük veri boru hatları, log toplama, olay kaynaklama (event sourcing), anlık analiz.

 

C# ile Kafka Kullanımı: Hadi Kodlayalım!

Şimdi işin mutfağına girelim. .NET dünyasında Kafka kullanmak için en popüler kütüphane `Confluent.Kafka` paketidir.

#### 1. Hazırlık
NuGet üzerinden paketimizi indirelim:
“`bash
dotnet add package Confluent.Kafka
“`

#### 2. Producer (Mesaj Gönderen)
Bir mesajı Kafka’daki bir “Topic”e gönderen basit bir kod yazalım:

“`csharp
using Confluent.Kafka;
using System;

var config = new ProducerConfig { BootstrapServers = “localhost:9092” };

using (var producer = new ProducerBuilder<Null, string>(config).Build())
{
try
{
var result = await producer.ProduceAsync(“siparis-topic”,
new Message<Null, string> { Value = “Yeni bir sipariş geldi: #12345″ });

Console.WriteLine($”Mesaj iletildi: {result.Value} – Durum: {result.Status}”);
}
catch (ProduceException<Null, string> e)
{
Console.WriteLine($”Hata oluştu: {e.Error.Reason}”);
}
}
“`

#### 3. Consumer (Mesajı Alan)
Şimdi de o mesajı dinleyen servisimize bakalım:

“`csharp
using Confluent.Kafka;
using System;
using System.Threading;

var config = new ConsumerConfig
{
BootstrapServers = “localhost:9092”,
GroupId = “fatura-servis-grubu”,
AutoOffsetReset = AutoOffsetReset.Earliest
};

using (var consumer = new ConsumerBuilder<Ignore, string>(config).Build())
{
consumer.Subscribe(“siparis-topic”);

Console.WriteLine(“Mesajlar dinleniyor…”);
CancellationTokenSource cts = new CancellationTokenSource();

try
{
while (true)
{
var consumeResult = consumer.Consume(cts.Token);
Console.WriteLine($”Mesaj Alındı: {consumeResult.Message.Value}”);
// Burada fatura kesme işlemini yapabilirsin.
}
}
catch (OperationCanceledException)
{
consumer.Close();
}
}
“`

 

* Eğer bir “yap ve unut” (fire-and-forget) iş akışın varsa, mesajların hızlıca işlensin ve bitsin istiyorsan RabbitMQ senin için harika bir dosttur.
* Eğer verinin geçmişi önemliyse , devasa boyutlarda veriyi analiz edeceksen veya sistemindeki tüm olayları bir nehir gibi akıtmak istiyorsan Kafka tartışmasız liderdir.

Umarım bu yazı kafandaki soru işaretlerini gidermiştir. Bir sonraki teknik yazımızda görüşmek üzere, kodlamaya devam edin!


*Yazıyı beğendiyseniz paylaşmayı ve yorum yapmayı unutmayın!*

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir