CB DIGITAL
Tüm Makalelere Dön
Yazılım Geliştirme
3 Mart 2026
6 dakika okuma süresi

Message Queue Sistemleri: RabbitMQ vs Kafka Karşılaştırması

Cengiz Bozdemir
Cengiz BozdemirKurumsal Yazılım Mimarı
Message Queue Sistemleri: RabbitMQ vs Kafka Karşılaştırması

Modern Yazılım Mimarisinde Mesaj Kuyruğu (Message Queue) Sistemlerinin Rolü

Günümüzün karmaşık ve yüksek ölçekli yazılım ekosistemlerinde, monolitik yapılardan mikroservis mimarilerine geçiş, beraberinde servisler arası iletişim zorluklarını getirmiştir. Servislerin birbirleriyle senkronize bir şekilde konuşması (HTTP/REST gibi), bir servisteki gecikmenin tüm sistemi kilitlemesine neden olabilir. İşte bu noktada Message Queue (Mesaj Kuyruğu) sistemleri devreye girer. Mesaj kuyrukları, sistemler arasında asenkron iletişimi sağlayarak decoupling (bağlantısızlık), scalability (ölçeklenebilirlik) ve fault tolerance (hata toleransı) sunar.

Piyasada birçok çözüm bulunsa da, tartışmaların merkezinde genellikle iki dev isim yer alır: RabbitMQ ve Apache Kafka. Her iki teknoloji de mesaj iletimi için kullanılsa da, tasarım felsefeleri, mimari yapıları ve kullanım senaryoları kökten farklıdır. Bu makalede, bir kıdemli teknoloji yazarı gözüyle her iki sistemi teknik derinlikleriyle karşılaştıracak ve hangi senaryoda hangisinin tercih edilmesi gerektiğini analiz edeceğiz.

RabbitMQ: Akıllı Broker ve Geleneksel Mesajlaşmanın Gücü

RabbitMQ, 2007 yılında piyasaya sürülmüş, Erlang diliyle yazılmış ve AMQP (Advanced Message Queuing Protocol) protokolünü temel alan bir mesaj yönlendiricisidir. RabbitMQ'nun temel felsefesi "akıllı broker, saf tüketici" (smart broker, dumb consumer) üzerine kuruludur. Bu, mesajın nereye gideceğine, nasıl yönlendirileceğine ve ne zaman silineceğine broker'ın (RabbitMQ sunucusu) karar verdiği anlamına gelir.

RabbitMQ Mimarisi ve Çalışma Prensibi

RabbitMQ'da iletişim doğrudan bir kuyruğa mesaj göndermekle başlamaz. Arada Exchange adı verilen bir mekanizma bulunur. Bir üretici (producer), mesajı bir Exchange'e gönderir. Exchange ise Binding (bağlama) kurallarına ve Routing Key (yönlendirme anahtarı) değerine bakarak mesajı ilgili Queue (kuyruk) yapılarına iletir.

  • Direct Exchange: Mesajın yönlendirme anahtarı ile kuyruğun bağlı olduğu anahtar birebir eşleşmelidir.
  • Topic Exchange: Wildcard (yıldız veya kare sembolleri) kullanarak desen tabanlı yönlendirme yapar.
  • Fanout Exchange: Gelen mesajı, kendisine bağlı olan tüm kuyruklara kopyalar (broadcast).
  • Headers Exchange: Mesajın başlık bilgilerine (header) göre yönlendirme yapar.

RabbitMQ'da mesaj tüketildikten ve tüketici tarafından bir Acknowledgement (ACK) (onay) gönderildikten sonra mesaj kuyruktan silinir. Bu, sistemin kaynaklarını verimli kullanmasını sağlar ancak mesajın geçmişe dönük tekrar okunmasını imkansız kılar.

Apache Kafka: Dağıtık Log İşleme ve Yüksek Veri Akışı

Apache Kafka, LinkedIn tarafından geliştirilmiş ve daha sonra açık kaynak kodlu hale getirilmiş bir distributed streaming platform (dağıtık akış platformu) olarak tanımlanır. Kafka, RabbitMQ'dan farklı olarak bir mesaj kuyruğu gibi değil, bir distributed commit log (dağıtık işlem günlüğü) gibi çalışır. Kafka'da "saf broker, akıllı tüketici" (dumb broker, smart consumer) modeli esastır.

Kafka Mimarisi: Topic, Partition ve Offset

Kafka'da veriler Topic adı verilen kategorilerde saklanır. Her topic, ölçeklenebilirliği sağlamak için Partition (bölüm) yapılarına ayrılır. Veriler bu bölümlere sıralı ve değişmez (immutable) bir şekilde eklenir. Her mesajın bölüm içindeki sırasını belirleyen benzersiz bir numarası vardır ve buna Offset denir.

Kafka'nın en belirgin özelliklerinden biri Persistence (kalıcılık) özelliğidir. Mesajlar tüketildikten sonra silinmez; belirlenen bir süre (retention period) veya boyut sınırına kadar diskte saklanmaya devam eder. Bu durum, tüketicilerin (consumer) istedikleri zaman geçmişe dönüp verileri tekrar okumasına (replayability) olanak tanır.

Kafka, veriyi disk üzerinde sıralı (sequential) bir şekilde yazar ve okur. Modern işletim sistemlerinin sayfa önbelleği (page cache) özelliklerini kullanarak, disk tabanlı olmasına rağmen inanılmaz derecede yüksek throughput (geçiş kapasitesi) değerlerine ulaşır.

RabbitMQ ve Kafka: Temel Teknik Farkların Karşılaştırması

İki sistemi birbirinden ayıran kritik farkları şu başlıklar altında detaylandırabiliriz:

1. Mesaj Tüketim Modeli: Push vs. Pull

RabbitMQ, Push-based bir model kullanır. Broker, tüketicinin kapasitesini (prefetch limit) dikkate alarak mesajları tüketiciye iter. Bu, düşük gecikme süresi (low latency) sağlar ancak tüketici hızlı gelen mesajlar altında ezilebilir. Kafka ise Pull-based bir model kullanır. Tüketiciler, kendi hızlarında ve kapasitelerinde mesajları broker'dan çekerler. Bu yapı, özellikle toplu veri işleme (batch processing) için idealdir.

2. Veri Kalıcılığı ve Yeniden İşleme

RabbitMQ'da mesajlar geçicidir. İşlenen mesaj sistemden atılır. Eğer bir hata oluşursa ve mesaj Dead Letter Exchange (DLX) mekanizmasıyla saklanmadıysa veri kaybolabilir. Kafka'da ise mesajlar diskte saklanır. Bu, sistemin bir kısmının çökmesi durumunda veya yeni bir analiz ihtiyacı doğduğunda verinin "baştan sona" tekrar işlenmesini sağlar.

3. Yönlendirme Yetenekleri (Routing)

RabbitMQ, karmaşık yönlendirme senaryolarında mutlak üstündür. Mesajları başlıklarına, anahtarlarına veya içeriklerine göre çok farklı kuyruklara dinamik olarak dağıtabilir. Kafka'da yönlendirme çok daha basittir; veri bir topic'e gider ve o topic'i dinleyen herkes aynı veriyi alır. Karmaşık yönlendirme mantığı Kafka tarafında genellikle uygulama katmanında (Kafka Streams gibi) çözülür.

4. Ölçeklenebilirlik

Kafka, yatayda ölçeklenmek (horizontal scaling) için tasarlanmıştır. Binlerce partition ve yüzlerce broker içeren kümeler (cluster) üzerinde saniyede milyonlarca mesajı rahatlıkla işleyebilir. RabbitMQ da ölçeklenebilir ancak dikey ölçeklemeye (vertical scaling) daha fazla ihtiyaç duyar ve küme büyüdükçe yönetim karmaşıklığı ile performans kayıpları artabilir.

Hangi Senaryoda Hangisi Tercih Edilmeli?

Bir teknoloji seçimi yaparken sistemin ihtiyaçlarını doğru belirlemek hayati önem taşır. İşte seçim yapmanızı kolaylaştıracak rehber:

Aşağıdaki Durumlarda RabbitMQ Tercih Edin:

  • Sisteminizde karmaşık routing (yönlendirme) kuralları varsa.
  • Mesajların anında işlenmesi ve düşük gecikme (latency) öncelikliyse.
  • Uygulamanız Request-Response (İstek-Yanıt) modeline yakın bir asenkron yapı gerektiriyorsa.
  • Mesajların sırasından ziyade, başarılı bir şekilde ulaşması ve işlenmesi (guaranteed delivery) kritikse.
  • Legacy sistemlerle entegrasyon için MQTT, STOMP gibi farklı protokol desteğine ihtiyacınız varsa.

Aşağıdaki Durumlarda Kafka Tercih Edin:

  • Saniyede yüz binlerce veya milyonlarca mesajın işlendiği High Throughput senaryolarında.
  • Event Sourcing veya Change Data Capture (CDC) gibi verinin geçmişinin saklanması gereken mimarilerde.
  • Gerçek zamanlı veri analitiği ve Stream Processing (akış işleme) yapılıyorsa.
  • Verinin birden fazla farklı servis tarafından, farklı zamanlarda tekrar tekrar okunması gerekiyorsa.
  • Log toplama ve sistem izleme (monitoring) verilerinin merkezi bir yere aktarılması hedefleniyorsa.

Performans Analizi: Gecikme ve Kapasite Dengesi

Teknik açıdan bakıldığında, RabbitMQ mesaj başına mikrosaniye veya düşük milisaniye düzeyinde gecikme sunar. Bu, finansal işlemler veya kullanıcı bildirimleri gibi anlık tepki gerektiren sistemler için mükemmeldir. Ancak RabbitMQ'nun kuyrukları şiştiğinde (backlog oluştuğunda) performans ciddi şekilde düşer çünkü bellek yönetimi zorlaşır.

Kafka'da ise tekil mesaj gecikmesi RabbitMQ'ya göre biraz daha yüksek olabilir (genellikle milisaniye seviyelerinde). Fakat Kafka'nın asıl gücü, toplam kapasitedir. Disk tabanlı yapısı sayesinde, kuyrukta milyarlarca mesaj birikse bile okuma ve yazma hızı neredeyse hiç etkilenmez. Bu özellik Kafka'yı "verinin asla durmadığı" sistemlerin vazgeçilmezi yapar.

Sonuç

RabbitMQ ve Kafka birbirinin doğrudan rakibi gibi görünse de aslında farklı problemlerin çözümleridir. RabbitMQ, güvenilir bir postacı gibi çalışarak mesajları doğru adrese hızlıca ulaştırır. Kafka ise devasa bir arşiv kütüphanesi gibidir; gelen her bilgiyi sırasıyla kaydeder ve ihtiyacı olanın gelip okumasına izin verir.

Modern bir mikroservis ekosisteminde her ikisinin de aynı anda kullanıldığı senaryolar oldukça yaygındır. Örneğin, servisler arası emir iletimi için RabbitMQ kullanılırken, tüm sistemin loglarını ve kullanıcı hareketlerini analiz etmek için Kafka tercih edilebilir. Önemli olan, elinizdeki aracın limitlerini bilmek ve mimarinizi bu limitlere göre şekillendirmektir.

#rabbitmq#kafka#message-queue#mikroservis#yazilim-mimarisi
Cengiz Bozdemir

Cengiz Bozdemir

Kurumsal Yazılım Mimarı & Full-Stack Geliştirici

İşletmeniz veya girişiminiz için yüksek performanslı sistemler, özel yazılımlar ve yapay zeka otomasyonları inşa ediyorum.

KURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITAL
© 2026 CB DIGITAL Tüm hakları saklıdır.