Kafka vs. RabbitMQ

Message Broker teknolojilerinden öne çıkan iki isim olan Kafka ve RabbitMQ’nun farklarını ve hangi durumlarda hangisinin tercih edilebileceğine dair bilgileri bir araya toplamak istedim. Tabi ki iki teknolojinin de karakteristik özellikleri, avantajları ve dezavantajlar vardır. İki teknoloji de farklı ihtiyaçlara cevap vermektedir. Sizin için hangisinin en uygun olduğunu yine sizin gereksinimleriniz belirleyecektir.

Kafka

Kafka dumb-broker / smart consumer modelini kullanılır. Bunun anlamı; broker kendisinden bir mesaj talep edildiğinde o mesajı verir ancak mesajın iletilip iletilmediği ile ilgilenmez veya queue içerisinde cursor’ın nerede kaldığını bilmez. Cursor’ın nerede kaldığını consumer bilmek zorundadır. Genellikle büyük ölçekli mesajlaşma uygulamalarında veya streaming uygulamalarında kullanılır. Streaming uygulamalarında tercih edilmesinin sebebi mesajların kaybolmaması, persistent olarak saklanmasıdır. Böylece kullanıcı bir video’yu geri sarmak istediğinde broker eski mesajları kolayca çıkarıp consumer’a gönderecektir.

  • Event odaklı bir mimari varsa (consumer’lar mesaj almak için broker’ı tetikleyecekse),
  • Mesajların kalıcı olmasını istiyorsanız (persistency),
  • Kolay ölçeklenebilir Cluster yapısına ihtiyaç varsa,
  • Consumer’ların offline olduğu durumlarda mesajın kaybolmamasını istiyorsanız,
  • Çok fazla sayıda mesajlaşma yapılıyorsa (saniyede 100k ideal ancak gerekli konfigürasyon ile saniyede bir kaç milyon mesajlaşmanın üstesinden gelebilir),
  • Stream Processing yapıyorsanız,
  • Ancak en önemlisi cursor’ın queue ‘da nerede kalındığını consumer’ın bilmesini ve yönetmesini (consumer-centric) istiyorsanız

Kafka’yı tercih etmeniz mantıklı olacaktır.

Kafka’nın dezavantajları:

  • Mesajın iletilmesini garanti etmez. (acknowledge yok)
  • Tek bir protokol kullanılıyor.(Native Kafka Protocol)
  • Geliştirme ortamınız .NET ise piyasadaki SDK’lardan birini kullanmak zorundasınız. Resmi olarak destek vermiyorlar.

RabbitMQ

RabbitMQ smart-broker /dumb consumer modelini kullanır. Yani burada cursor’ın nerede kaldığını broker bilmek zorundadır. Broker mesajın iletilip iletilmediğini kendisine ulaşan bir acknowledge sayesinde takip eder. Böylece mesajın consumer’a iletimi garanti altına alınmış olur.

  • Farklı protokoller kullanmak istiyorsanız(AMQP 0–9–1, STOMP, MQTT, AMQP 1.0),
  • Yüksek performansa ihtiyaç varsa,
  • Kolay entegrasyon istiyorsanız (dokümantasyonu oldukça güçlü, bir çok client library’si mevcut),
  • Geliştirme ortamınız .Net ise (resmi olarak desteği var),
  • Farklı topolojilere uyumlu olmasını istiyorsanız,
  • Mesajın ulaşmasını garanti altına almak istiyorsanız,
  • Kafka’ya göre daha az sayıda mesajlaşma yapılıyorsa (saniyede 20k ideal ancak saniyede bir milyon mesajlaşmayı da kaldırabilecek biçimde geliştirildi),
  • Cursor’ın queue’da nerede kaldığını broker’ın belirlemesini (broker-centric) istiyorsanız

RabbitMQ’yu tercih etmeniz mantıklı olacaktır.

RabbitMQ’nun dezavantajları:

  • Queue içerisinde filtreleme yapmak veya veriyi güncellemek istiyorsanız bunu doğrudan yapamıyorsunuz. Data flow veya processing frameworklerine ihtiyaç var. (Apache Beam, Spark, Flink vs.)
  • Consumer’ların online olduğunu var sayar ve acknowledge gelmediği sürece mesajın durumunu beklemede olarak işaretler.
  • Yüksek hacimli mesajlaşma için uygun olmayabilir.
  • Mesajların kalıcı (persistent) olması için persistent modunda kullanmanız gerekmektedir. Aksi takdirde RabbitMQ servisi restart olduğunda tüm mesajlar kaybolacaktır.