Alet Çantasındaki İki Farklı Çekiç
Danışmanlık yaptığım şirketlerde en sık gördüğüm hata, "Popüler olanı seçelim" mantığıyla 50 mesajlık bir kuyruk için Kafka cluster'ı kurmaya çalışmak veya milyonlarca log verisini RabbitMQ'ya tıkmaya çalışmaktır.
RabbitMQ: "Akıllı Broker, Aptal Consumer"
RabbitMQ, mektup dağıtan bir postacı gibidir. Mektubu (mesajı) alır, doğru kutuya (queue) koyar ve alıcı (consumer) mektubu aldığında "işim bitti" der, mektup yok olur.
- Senaryo: E-ticarette "Sipariş Alındı" maili atmak.
- Neden: Karmaşık routing yapabilirsiniz. "Hata oluşursa Dead Letter Queue'ya at, 5 dakika sonra tekrar dene" gibi lojikler RabbitMQ'nun uzmanlık alanıdır.
- Sınır: Mesaj sayısı çok artarsa ve consumer'lar yetişemezse, RabbitMQ belleği şişer ve patlar.
Apache Kafka: "Aptal Broker, Akıllı Consumer"
Kafka bir postacı değil, devasa bir Log Defteridir. Gelen her şeyi sırayla yazar ve asla silmez (retention süresi bitene kadar). Consumer, "Ben 5. sayfada kaldım" diye kendi yerini (offset) kendisi takip eder.
- Senaryo: Kullanıcı tıklama verilerini analiz etmek veya CDC (Change Data Capture) ile veritabanı replikasyonu.
- Neden: Saniyede 1 milyon mesajı diske yazabilir. Consumer çökse bile geri geldiğinde kaldığı yerden (veya en baştan) okuyabilir. Event Sourcing için biçilmiş kaftandır.
- Bedel: Kurulumu ve bakımı (ZooKeeper/KRaft) zordur. Tekil mesaj silme veya "Priority Queue" gibi kavramlar yoktur.
Benim Tercihim
Mikroservisler arası "Komut" (Command - "Fatura Kes") iletişimi için RabbitMQ (veya bulutta SQS) kullanırım. Çünkü işlemin sonucundan emin olmam gerekir.
Ancak "Durum" (Event - "Sipariş Oluştu") dağıtımı ve veri akışı için Kafka (veya Redpanda) vazgeçilmezdir.
İkisini aynı kefeye koymayın; biri yönlendirici (Router), diğeri depolayıcıdır (Storage).
