Kafka ile Reddit arasındaki fark nedir?

Redis, bellek içi bir anahtar-değer veri deposuyken Apache Kafka ise bir akış işleme altyapısıdır. Ancak her ikisini de bir yayınla-abone ol (pub/sub) mesajlaşma sistemi oluşturmak için kullanabileceğinizden bu iki teknolojiyi karşılaştırabilirsiniz. Modern bulut mimarisinde uygulamalar, hizmetler adı verilen daha küçük ve bağımsız yapı taşlarına ayrılır. Pub/sub mesajlaşma, bu dağıtılan sistemler için anlık olay bildirimleri sağlar. Kafka, yayıncıların ve abonelerin, abonelerin gerektiğinde mesaj aldığı ortak bir mesaj kuyruğunu paylaştığı, alma tabanlı bir sistemi destekler. Redis, bir olay gerçekleştiğinde yayıncının mesajları tüm abonelere dağıttığı gönderme tabanlı bir sistemi destekler.

Kafka hakkında bilgi edinin »

Redis hakkında bilgi edinin »

Çalışma yöntemleri: Kafka ve Redis pub/sub

Apache Kafka, birden fazla uygulamanın birbirinden bağımsız veri akışı yapmasını sağlayan bir olay akış platformudur. Üreticiler ve tüketiciler olarak adlandırılan bu uygulamalar, konu adı verilen belirli veri bölümlerine ve veri bölümlerinden bilgi yayınlar ve bilgileri kaydeder.

Bu arada Redis, uygulamalar arasında düşük gecikmeli veri aktarımını destekleyen bir bellek içi veritabanı olarak tasarlanmıştır. Veri okuma ve yazma süresini azaltmak için tüm mesajları sabit disk yerine RAM'de saklar. Kafka gibi, birden fazla tüketici de mesajları almak için bir Redis akışına abone olabilir.

Her ikisini de pub/sub mesajlaşması için kullanabilirsiniz ancak Kafka ve Redis farklı çalışır.

Kafka iş akışı

Apache Kafka, üreticileri ve tüketicileri işlem kümeleri aracılığıyla birbirine bağlar. Her küme, farklı sunucularda bulunan çeşitli Kafka aracılarından oluşur.

Kafka bu amaçlar için konular ve bölümler oluşturur:

  • İlgilendiğiniz bir konuya ait e-posta, ödeme, kullanıcılar ve satın alma gibi benzer verileri gruplandırmaya yönelik konular
  • Veri çoğaltma ve hata toleransı için farklı aracılardaki bölümler

Üreticiler aracıya mesajları yayınlar. Aracı bir mesaj aldığında verileri bir konuya kategorize eder ve verileri bir bölümde saklar. Tüketiciler ilgili konuya bağlanır ve bölümünden verileri ayıklar.

Redis iş akışı

Redis, NoSQL veri tabanı sistemi olarak bir istemci-sunucu mimarisiyle çalışır. Üreticiler ve tüketiciler esnek bağlantılıdır ve mesaj gönderirken birbirlerini tanımak zorunda değildir.

Redis, şu amaçlar için anahtarları ve birincil-ikincil düğümleri kullanır:

  • Benzer mesajları gruplandırmak için anahtarlar. Örneğin, "e-posta", yalnızca e-posta iletilerini tutan veri deposuna işaret eden bir anahtardır. 
  • Mesaj çoğaltma için birincil-ikincil düğümler.

Bir üretici belirli bir düğüme mesaj gönderdiğinde Redis mesaj anahtarını kontrol ederek mesajı bağlı olan tüm abonelere iletir. Tüketici, mesajları almak için her zaman Redis sunucusuyla etkin bir bağlantı başlatmalı ve sürdürmelidir. Bu, bağlantılı teslim semantiği olarak bilinir.

Pub/sub mesajlaşma hakkında bilgi edinin »

Mesaj işleme: Kafka ve Redis pub/sub

Apache Kafka, geliştiricilere yüksek oranda ölçeklenebilir dağıtılmış mesajlaşma sistemlerini sağlar. Bu arada Redis, bir uygulamanın verileri birden fazla düğüme hızlı bir şekilde göndermesini sağlayan zengin veri yapıları sunar. Her iki sistemin de mesaj sıraya alma mekanizmalarında birkaç farklılığı vardır.

Mesaj boyutu

Kafka ve Redis, tüketiciler ve aboneler arasında küçük boyutlu veri paketleri gönderdiklerinde en iyi şekilde çalışır.

Özellikle Redis, aktarım hızından ödün vermeden büyük veri boyutlarını işlemek için tasarlanmamıştır. Ayrıca, RAM disk depolamasından daha düşük bir kapasiteye sahip olduğundan yüksek miktarda veri depolayamaz. 

Bu arada Kafka, bunu yapmak için özel olarak tasarlanmamış olmasına rağmen çok büyük mesajları destekleyebilir. Kafka mesajı sıkıştırırsa ve siz de katmanlı depolama için yapılandırırsanız 1 GB'ye kadar olan mesajları işleyebilir. Tüm mesajları yerel depolama alanında depolamak yerine, tamamlanan günlük dosyalarını depolamak için uzak depolama alanı kullanır. 

Mesaj teslimi

Kafka tüketicileri verileri mesaj kuyruğundan alır. Her Kafka tüketicisi, okuduğu mesajı bir sonraki mesajı alacak şekilde güncellediği bir ofsetle takip eder. Tüketiciler yinelenen mesajları algılayabilir ve izleyebilir.

Öte yandan, Redis mesajı otomatik olarak bağlı olan abonelere iter. Redis aboneleri, sunucudan kendilerine yönlendirilen gelen mesajları pasif olarak bekler. En fazla bir kerelik bir teslim kurulumu olduğu için Redis aboneleri yinelenen mesajları algılayamaz.

Mesaj saklama

Kafka, mesajları tüketiciler okuduktan sonra saklar. Bu nedenle bir istemci uygulaması, alınan verileri kaybederse bu verileri abone olduğu bölümden tekrar isteyebilir. Kullanıcılar, mesaj saklama politikasını ayarlayarak Kafka'nın verileri ne kadar süre saklayacağına karar verebilir. 

Bunun tersine, Redis mesajları teslim edildikten sonra saklamaz. Hiçbir abone akışa bağlı değilse Redis mesajları iptal eder. Abone daha sonra Redis'e bağlansa bile iptal edilen mesajlar kurtarılamaz.  

Hata işleme 

Hem Kafka hem de Redis, uygulamaların güvenilmez mesaj dağıtımını azaltmasına izin verir ancak bunu farklı şekilde yaparlar.

Redis'te hata işleme, istemci uygulaması ile Redis hizmetleri arasındaki etkileşime odaklanır. Redis ile geliştiriciler, istemci zaman aşımları, arabellek aşımı ve maksimum istemci sınırları gibi durumları ele alabilir. Redis, anahtar-değer çifti veritabanı mimarisi nedeniyle Kafka'nın yaptığı gibi güçlü mesaj hatası işleme özelliğini sağlayamaz. 

Kafka geliştiricileri, hatalı olayları bir teslim edilemeyen mesaj kuyruğunda saklayabilir, yeniden deneyebilir veya bunları istemci uygulamalarına tutarlı mesaj teslimi sağlamak için yeniden yönlendirebilir. Geliştiriciler, bazı hatalarda bağlayıcı görevlerini otomatik olarak yeniden başlatmak için Kafka Connect API'sini de kullanabilir.

Teslim edilemeyen mesaj kuyrukları hakkında bilgi edinin »

Performans farklılıkları: Kafka ve Redis pub/sub

Kafka veri akışı için özel olarak tasarlandığından Apache Kafka, genel olarak pub/sub mesajlaşmada Redis'i geride bırakır. Redis için Kafka'nın kullanılamadığı birkaç farklı kullanım örneği vardır. 

Paralellik

Paralellik, birden fazla tüketicinin aynı mesajı aynı anda alabilmesidir.

Redis paralelliği desteklemez.

Öte yandan Kafka, aynı mesajın aynı anda birden fazla tüketiciye dağıtılmasına izin verir. Kafka tüketici gruplarındaki tüketiciler genellikle bir bölümden yeni mesajları sırayla alır. Birden fazla tüketici grubunda tek bir tüketici varsa tüm mesajları o tüketici alır. Bu kurulum ve bölüm çoğaltmasından yararlanarak her bir bölüm çoğaltmasındaki her tüketici grubuna bir tüketici atayabilirsiniz. Bu, tüm tüketicilerin benzer bir mesaj sırası almasını sağlar. 

Aktarım Hızı

Aktarım hızı, her sistemin bir saniyede işleyebileceği mesaj sayısını ölçer.

Kafka genellikle Redis pub/sub'dan daha yüksek aktarım hızına sahiptir. Kafka, her abonenin bir diğerine geçmeden önce mesajı almasını beklemek zorunda olmadığından çok daha büyük veri hacimlerini işler. Bunun yerine, güncel mesajları okuma hızını optimize eden bir önbellekte ve depolama alanında saklar. 

Ancak önbellekteki okunmamış mesajlar en sonunda kaldırıldığı için tüketiciler mesajı yeterince hızlı almıyorsa Kafka'nın performansı düşebilir. Bu durumda, tüketiciler diskten okuma yapmalıdır ve bu da daha yavaştır.

Bu arada, Redis her tüketici için onay beklemelidir. Bu da daha fazla bağlı düğümle aktarım hızını önemli ölçüde düşürür. Geçici bir çözüm olarak işlem hattı oluşturma adı verilen bir süreçle birden fazla istek gönderilir. Ancak bu da mesajlaşma gecikme süresini azaltır. 

Gecikme süresi

Hem Kafka hem de Redis, düşük gecikme süreli veri işleme için uygundur. Redis, milisaniye cinsinden değişkenlik gösteren daha düşük bir mesajlaşma süresi sunarken Kafka'nın ortalaması on milisaniyedir.

Redis'in öncelikle RAM'de veri okuduğu ve yazdığı düşünüldüğünde doğal olarak hızda Kafka'yı küçük bir farkla geride bırakır. Ancak Redis, daha büyük mesajları işlediğinde ultra düşük gecikme süreli veri işlemlerini sürdürmeyebilir. Bu arada, Kafka'nın veri kalıcılığı için farklı fiziksel sürücülerdeki bölümleri çoğaltmak üzere daha fazla zamana ihtiyacı vardır. Bu da mesaj teslim süresine işletim yükü getirir.

Redis ve Kafka için gecikme süresi optimize edilebilir, ancak bunu dikkatli bir şekilde yapmalısınız. Örneğin, gecikme süresini azaltmak için Kafka mesajlarını sıkıştırabilirsiniz, ancak üreticilerin ve tüketicilerin bunları açmak için daha fazla zamana ihtiyacı vardır.

Redis'teki gecikme süresi, çalışma ortamı, ağ işlemleri, yavaş komutlar veya çatallaşma gibi çeşitli faktörlerden etkilenebilir. Redis, çatallaşma gecikme sürelerini azaltmak için bir Donanım Sanal Makinesi (HVM) tabanlı modern EC2 bulut sunucularında pub/sub teslim sisteminin çalıştırılmasını önerir.

Hata toleransı

Kafka, tüm verileri önde gelen bir aracının depolama diskine yazar ve farklı sunucularda çoğaltır. Bir sunucu hata verdiğinde birden fazla abone verileri yedekleme bölümlerinden alır. 

Kafka'nın aksine, Redis verileri varsayılan olarak yedeklemez ve kullanıcıların özelliği manuel olarak etkinleştirmesi gerekir. Redis, bellek içi veri deposunu kullanır ve bu da kapatıldığında tüm verileri kaybeder. Geliştiriciler, bunu engellemek için RAM verilerinin anlık görüntülerini periyodik olarak yakalamak ve diskte saklamak için Redis Veritabanı (RDB) kalıcılığını açar. 

Kullanım zamanı: Kafka ve Redis pub/sub

Apache Kafka, büyük veri kümeleri akışı yapan ve yüksek kurtarılabilirlik gerektiren uygulamalar oluşturmak için daha iyi bir seçimdir. İlk başta, içinden geçen trilyonlarca mesajı işleyebilecek tek bir dağıtılmış veri işlem hattı olarak geliştirildi. Kafka, bir düğüm başarısız olduğunda veri kaybını önlemek için bölümleri farklı sunucular arasında çoğaltır. Kuruluşlar Kafka'yı uygulamalar, mobil Nesnelerin İnterneti (IoT) cihazları ve mikro hizmetler arasındaki gerçek zamanlı iletişimi desteklemek amacıyla kullanır. Ayrıca günlük toplama, akış işleme ve diğer bulut tabanlı veri entegrasyonu görevleri için daha iyi seçimdir.

Bu arada Redis, anlık veri aktarımı gerektiren ancak küçük veri kaybına tolerans gösteren uygulamalar için ultra düşük gecikme süreli olay dağılımı sağlar. Redis, sık erişilen verileri depolamak veya acil mesajları teslim etmek için genellikle oturum önbelleği olarak kullanılır. Daha sorunsuz bir kullanıcı deneyimi sağlamak üzere oyun, e-ticaret veya sosyal medya verilerini depolamak için de uygundur.

Farklılıkların özeti: Kafka ve Redis pub/sub

 

Apache Kafka

Redis

Mesaj boyutu

Sıkıştırma ve katmanlı depolama ile 1 GB'ye kadar mesajları destekler.

Daha küçük boyutlu mesajları destekler.

Mesaj teslimi

Aboneler mesajları kuyruktan çeker.

Redis sunucusu mesajları bağlı abonelere iletir.

Mesaj saklama

Mesajları aldıktan sonra saklar. 

Mesajları saklamaz.

Hata işleme

Mesajlaşma düzeyinde güçlü hata işleme. Teslim edilemeyen mesaj kuyruğu, olay yeniden deneme ve yeniden yönlendirme.

Redis özel durumlarını uygulama düzeyinde zaman aşımları, istemci sınırları ve arabellek kapasitesi ile işlemeniz gerekir. 

Paralellik

Kafka paralelliği destekler. Birden fazla tüketici aynı mesajı aynı anda alabilir. 

Paralelliği desteklemez.

Aktarım Hızı

Zaman uyumsuz okuma/yazma nedeniyle aktarım hızı daha yüksektir. 

Redis sunucusunun başka bir aboneye mesaj göndermeden önce yanıt beklemesi gerektiğinden aktarım hızı daha düşüktür. 

Gecikme Süresi

Düşük gecikme süresi. Varsayılan olarak veri çoğaltması nedeniyle Redis'ten biraz daha yavaş. 

Daha küçük boyutlu mesajları dağıtırken ultra düşük gecikme süresi.

Hata toleransı

Bölümleri otomatik olarak farklı aracılara yedekler. 

Varsayılan olarak yedekleme yapmaz. Kullanıcılar Redis kalıcılığını manuel olarak etkinleştirebilir. Düşük veri kaybı riski. 

AWS, Kafka ve Redis gereksinimlerinizi nasıl destekleyebilir?

Amazon Web Services (AWS), yayınla-abone ol (pub/sub) mesajlaşma gereksinimlerinizi desteklemek için ölçeklenebilir ve yönetilen altyapı sağlar. 

Büyük hacimli verileri gerçek zamanlı olarak kolayca almak ve işlemek için Apache Kafka için Amazon Yönetilen Akışını (Amazon MSK) kullanın. Uygun ölçekte yüksek oranda erişilebilir akış düğümleri sağlamak için özel olarak erişilen bir veri yolu oluşturabilirsiniz. Ayrıca AWS IoT Core, Amazon Sanal Özel Bulut (Amazon VPC) ve Apache Flink İçin Amazon Yönetilen Hizmet gibi diğer AWS hizmetleriyle de sorunsuz bir şekilde bağlantı kurabilirsiniz.

Redis iş yükleriniz için yüksek oranda erişilebilir bellek içi depolama sağlamak üzere Amazon MemoryDB'yi kullanın. Kullanıcı etkinliğini almak için yüksek eş zamanlılığa sahip akış verisi beslemelerini çalıştırabilirsiniz. Medya ve eğlence uygulamaları için günde milyonlarca isteği destekleyebilirsiniz.

Bir pub/sub mesajlaşma sistemi oluşturmak için Redis veya Kafka yerine Amazon Basit Bildirim Hizmetini (Amazon SNS) de kullanabilirsiniz. Doğrudan uygulamalarınızdan müşterilere veya diğer uygulamalara ölçeklenebilir ve uygun maliyetli bir şekilde mesajlar gönderebilirsiniz. Amazon SNS birkaç farklı özellik sunar. Örneğin:

  • Dağıtılmış sistemler, mikro hizmetler ve olay tabanlı sunucusuz uygulamalar arasında yüksek aktarım hızlı, gönderme tabanlı, çoğa çok mesajlaşma.
  • Mesaj şifreleme ve trafik gizliliği.
  • AWS kategorilerinde yayma özellikleri. Bu kapsamda analiz, işlem, container'lar, veritabanları, Nesnelerin İnterneti (IoT), makine öğrenimi (ML), güvenlik ve depolama bulunur.

Hemen bir hesap oluşturarak AWS'de pub/sub, Redis ve Kafka'yı kullanmaya başlayın.