Mikroservislerin Uygulama İletişiminde Kullanımı: RabbitMQ, ZeroMQ, Apache Kafka

Mikroservislerin Uygulama İletişiminde Kullanımı: RabbitMQ, ZeroMQ, Apache Kafka

Mikroservis mimarisi kullanan uygulamalar arasında verimli ve güvenli iletişim kurmanın yolu RabbitMQ, ZeroMQ ve Apache Kafka kullanmaktan geçiyor Bu yazımızda bu araçların kullanımı hakkında detaylı bilgilere ulaşabilirsiniz

Mikroservislerin Uygulama İletişiminde Kullanımı: RabbitMQ, ZeroMQ, Apache Kafka

Mikroservisler, günümüzde yaygın olarak kullanılan uygulamaların oluşturulmasında önemli bir rol oynamaktadır. Ancak, bu servisler tek başlarına iş yapmamaktadır; birbirleriyle iletişim kurmaları gerekmektedir. İşte bu noktada, RabbitMQ, ZeroMQ ve Apache Kafka gibi araçlar devreye girmektedir. Bu makalede, bu araçların nasıl kullanıldığı ve birbiriyle karşılaştırılması ele alınacaktır.


RabbitMQ

RabbitMQ, açık kaynak kodlu bir mesaj yazılımıdır ve yayıncılar ile yerel aboneler arasındaki mesajlar için kullanılır. RabbitMQ, dağıtılmış bir sistemde veri ve işlemleri yönetmek için kullanılan bir araçtır. Yapılandırılabilir mesajlar kullanarak, uygulamalar arasında anlaşılabilir bir şekilde mesajlaşmaya izin verir. Bu teknoloji sayesinde, uygulamalar arasında bağlantı kurmak ve veri göndermek oldukça kolay hale gelir.

RabbitMQ, uygulama entegrasyonu konusunda oldukça kullanışlıdır. Kullanıcılar, dinamik bir şekilde uygulama bileşenleri oluşturabilir ve bunları farklı işletim sistemlerinde veya dil ve platformlar arasında kullanabilir ve esnek bir şekilde uyum sağlayabilirler. Birçok farklı konfigürasyon sunan RabbitMQ, kullanıcılarının ihtiyaçlarına özelleştirilebilir.

  • Birincil mesajlar
  • Kuyruklama
  • Aktif-abone modeli
  • Yayın-konu modeli

Birçok farklı özelliği ve kullanım alanı sayesinde RabbitMQ, modern uygulamalar için ideal bir mesajlaşma aracıdır.


ZeroMQ

ZeroMQ, yüksek performanslı mesaj alışverişi için basit ve hafif bir kütüphane sağlar. Bu kütüphane, en düşük bağımlılık ve yüksek ölçeklenebilirlik seviyesi ile birlikte çalışır. ZeroMQ, uygulamalar arasında mesaj alışverişini daha hızlı ve daha güvenilir hale getirir. Ayrıca, birçok farklı dilde uygulamalara entegre edilebilir.

ZeroMQ, farklı senaryolara uyacak şekilde birkaç farklı tür sunduğu için son derece esnektir. PUB-SUB soketleri, yayıncı ve abone modellerinde kullanılırken, REQ-REP soketleri istemci-sunucu etkileşimlerinde kullanılır. Bunun yanı sıra, ZeroMQ, iş yükünü diğer işlemcilerden rastgele dağıtmak için kullanılan bir çok-yaygın model kullanan Push-Pull topolojisini ve işleme limbolarını art arda bağlamak için sağlam bir yol sağlayan Pipeline topolojisini sağlar.


ZeroMQ Socket Türleri

ZeroMQ, farklı senaryolara uyacak şekilde birkaç farklı socket türü sunmaktadır. PUB-SUB Sockets yayıncı-abone modellerinde kullanılırken, REQ-REP sockets istemci-sunucu etkileşimlerinde kullanılır.

Bununla birlikte, DEALER-ROUTER sockets en karmaşık senaryoları kapsar. ROUTER soketi, bir dizi işlemciye bağlantı isteklerinin gönderilmesine olanak tanırken, DEALER soketi, farklı işlemcilere istekler gönderir. Bu tür soketler, daha da karmaşık sistemi olanlar için uygundur.

ZeroMQ ayrıca, özel bir tür olarak XREQ-XREP Soketleri sağlar. Bu soketler daha esnek ve özelleştirilebilir bir senaryo sunar.

  • PUB-SUB soketleri
  • REQ-REP soketleri
  • DEALER-ROUTER soketleri
  • XREQ-XREP soketleri

ZeroMQ sockets, farklı senaryolara uyacak şekilde birkaç farklı tür sunmaktadırlar ve kullanıcılara özelleştirilebilir seçenekler sunmaktadırlar. Özellikle, daha karmaşık senaryolara sahip kullanıcılar için DEALER-ROUTER Socketleri kullanılabilir.


PUB-SUB Sockets

PUB-SUB soketleri, yayıncı abone modellerinde kullanılır. Bu modelde, bir yayıncı, bir veya daha fazla aboneye mesaj gönderir. Aboneler, mesajları almak ve işlemek üzere kendi mesaj kuyruklarını oluşturur. Bu sayede, her bir abone, yayıncı tarafından gönderilen mesajları alabilir ve tek bir yayıncı, birçok aboneye mesaj gönderebilir. PUB-SUB modeli, birçok senaryoda kullanılır ve özellikle olay tabanlı uygulamalar için idealdir.


REQ-REP Sockets

ZeroMQ'nun REQ-REP soket türü, istemci-sunucu etkileşimleri için tasarlanmıştır. Bu tür, istemci tarafından gönderilen bir isteği sunucuya yönlendirir ve sunucu da bir yanıt verir. Bu işlem tamamlandığında, istemciye yanıt döndürülür. Bu soket tipi, yüksek ölçüde ölçeklenebilir ve esnek bir iletişim aracıdır.

Bu soket tipi, çok sayıda sunucu yanıtı yönetebilir ve birden fazla istemci tarafından kullanılabilir. Bu sayede, birçok senaryoda kullanılabilecek uygun bir seçenek haline gelir.


ZeroMQ Topolojileri

ZeroMQ, mesajların nasıl gönderildiği konusunda birkaç farklı topoloji sağlar. Bu topolojiler, veri akışının nasıl yönetildiği ve işlenmesiyle ilgilidir. ZeroMQ sockets, birden fazla limbodan oluşan bir mesaj akışı oluşturmaya izin verir ve mesajların gönderilme hızında yüksek performans sağlar.

Topoloji Adı Açıklama
Push-Pull Topolojisi Bu topoloji, iş yükünü diğer işlemcilerden rastgele dağıtmak için bir çok-yaygın model kullanır. "Push" adımı, mesajların bir limbodan diğerine gönderilmesini sağlar. "Pull" adımı, işlemcinin limbodan bekleyen mesajları almasına olanak tanır.
Pipeline Topolojisi Bu topoloji, işleme limbolarını art arda bağlamak için sağlam bir yol sağlar. Bu topolojide, mesajlar ilk adımdan son adıma kadar sırayla işlenir ve her bir adım ayrı bir işlemcidir. Bu topoloji, yüksek işlem hızına ihtiyaç duyan uygulamalarda yaygın olarak kullanılır.

ZeroMQ ayrıca req-rep, pub-sub ve dealer-router gibi farklı soket türleri sağlar, bu da farklı uygulama senaryolarına uygunluk sağlar. ZeroMQ, performansı artırmak için mesaj saklama noktaları yerine soketleri kullanır. Bu da daha hızlı, daha gecikmesiz ve istikrarlı bir iletişim sağlar.


Push-Pull Topolojisi

Push-Pull topolojisi, ZeroMQ'nin en yaygın modelidir ve iş yükünü diğer işlemcilere rastgele dağıtmak için kullanılır. Bu modelde, birden çok işlemci mevcuttur ve her işlemciden oluşan bir işçi havuzu vardır. Bu havuz, tek bir veri kaynağından iş yükünü aldığında, havuzdaki işçilerden biri bu iş yükünü ele alır.

Push-Pull topolojisi aynı zamanda paralel işlemeyi destekler ve işlemciler arasındaki yükü dengeler. Bu topoloji, düşük gecikme süresi ile yüksek verim ve performans sunar. Push-Pull topolojisi, başarılı bir şekilde dağıtılmış uygulamalar geliştirmek isteyen tüm geliştiriciler tarafından kullanılabilir.


Pipeline Topolojisi

Pipeline topolojisi, bir işlemi birden fazla aşamada işleyebilmek için kullanılır. Bu topolojide, birden fazla işlemci arasındaki bağlantılar tek yönlüdür ve işleme limboları art arda bağlanır. Bu şekilde, her bir aşaması farklı olan bir işlem parçası, bir diğerinin tamamlanmasını beklemek zorunda kalmadan başlatılabilir.

Bu topolojinin kullanılması, birden fazla küçük işlemci arasında iş yükünün daha homojen bir şekilde dağıtılmasını sağlar. Pipeline topolojisi, genellikle büyük işlemler üzerinde kullanılır ve her bir aşama, iş yükünün bir kısmını işler. Bu şekilde, bir çoklu işlemci dizisi, daha hızlı ve daha verimli bir şekilde çalışabilir.


Apache Kafka

Apache Kafka, günümüzün veri yoğun dünyasında, her geçen gün artan veri akışlarını ele almak için tasarlanmış bir veri işleme platformudur. Hem sistemler arası hem de sistemin içindeki verilerin yönetiminde kullanılır. Aynı zamanda olay işleme sistemleri ve gerçek zamanlı akış verileri için tasarlanmıştır. Kafka, yüksek performanslı bir veri yönetim sistemidir ve mesajlar yerine olaylara dayalı çalışır. Bu sayede gönderilen her bir mesajın saatlerce beklemesi beklenmez.

Kafka, dağıtılmış bir sistem olarak çalışır ve birbirleriyle etkileşim halinde olan birçok farklı sunucudan oluşur. Bu da sistemin genişleyebilirliğini artırır ve yüksek performanslı veri işleme yapılmasını sağlar. Kafka'nın, verilerin depolanması ve işlenmesi için bölümlere ayırdığı bir sistem vardır. Bu bölümler, verilerin daha hızlı işlenmesine olanak tanır.

Apache Kafka, veri yönetimi için tasarlanmış özel bir API'ye sahiptir. Bu API, yazılım geliştiricilerin, verileri Kafka aracılığıyla işlemeye almasına olanak tanır. Ayrıca, Kafka'nın Consumer ve Producer API'leri, platformu dağıtık ortamlarda kullanım için daha da ideal hale getirir. Bu da farklı sunucular ve uygulamalar arasındaki veri akışını sorunsuz bir şekilde yönetmeyi mümkün kılar.

Apache Kafka, büyük ölçekli veri işleme projelerinde sıklıkla tercih edilir. Yüksek skalabilite, düşük gecikme süresi ve kolay uygulanabilirliği ile uygun bir seçenek olarak karşımıza çıkar. Ayrıca, açık kaynak kodlu bir ürün olması, ücretsiz ve kolayca erişilebilir olması sayesinde kullanıcılara ek bir avantaj sağlar.


Kafka Anahtar Kavramlar

Kafka, kullanılan birkaç anahtar kavramla tanımlanır. Bunlar arasında:

  • Broker: Kafka'nın ana bileşenidir ve verilerin tutulduğu yerdir.
  • Topic: Mesaj yayınlama kavramıdır. Topic, mesajları tüketen uygulamaların izlemesi gereken bir kanaldır.
  • Partition: Kafka, Partition kavramı sayesinde verileri daha da parçalara ayırabilir. Her bir partition, kendi içinde birkaç replikaya sahip olabilir.

Kafka'nın bu anahtar kavramları, sistemi anlamak için önemlidir. Bunlar arasındaki ilişkilerin anlaşılması, Kafka kullanımını daha kolay hale getirecektir.


Broker

Broker, bir veri işlem platformu olan Kafka'nın ana bileşenidir ve verilerin tutulduğu yerdir. Bu bileşen, yüksek verimlilik ve yüksek depolama kapasitesi için tasarlanmıştır. Broker aynı zamanda birden fazla sunucuda çalışabilir ve verilerin daha verimli işlenmesine yardımcı olabilir. Genellikle CPU ve bellek yoğunluğu yüksek olan sunucularda kullanılır.

Ayrıca, broker verileri bölerek depolayabilir ve bu sayede daha fazla güvenlik ve ölçeklenebilirlik sağlar. Her bir partition, mesajların kaydedildiği ve işlendiği ayrı bir olay akışı sunar. Kafka, kullanıcıların broker'ların sayısını ölçeklendirebilecekleri ve büyütebilecekleri için oldukça esnek bir yapıya sahiptir.

Broker'lar, Kafka'da diğer bileşenlerle iletişim kurarak, mesajların veya verilerin çeşitli işlemlere tabi tutulmasına olanak tanır. Bazı örnekler ise, mesajları filtreleme, işleme veya depolama işlemleridir. Kafka kullanıcıları, özellikle veri yoğun uygulama senaryolarında ve yüksek işlem hızı gerektiren uygulamalarda, verilerin işlemlerini optimize edebilir.


Topic

Topic, mesajlaşma sistemi içinde önemli bir kavramdır. Temel anlamıyla, bir topic bir mesaj yayınlama kavramıdır. Yani, bir konu yayınlanabilir ve bu konuya kayıtlı olan bir abone bu mesajları alabilir. Topic konsepti, işlemci ve veri modelinde önemli bir bölümü oluşturur.

Örneğin, bir e-ticaret uygulaması için bir konu, sipariş işlemi olabilir. Sipariş işlemi oluşturulduğunda, konudaki aboneler siparişin ayrıntılarını alır. Çoklu aboneler olabilir ve hepsi aynı anda sipariş işlemine abone olabilir. Bu, yayınlanan mesajların geniş bir kitleye dağıtılabilmesi için önemlidir.

Bir konu, birçok alt konuya ayrılabilir. Bu alt konular, bir kategorinin altında toplanan kümeler şeklinde düşünülebilir. Bu, mesajların daha az dağıtılmasını sağlayacak, daha spesifik konulara bölünebilir ve daha hızlı mesaj iletimi sağlayacak. Konuların partition adı verilen bu alt konulara kadar ayrılabilmesi, Kafka'nın bir başka önemli kavramıdır.


Partition

Kafka'nın Partition konsepti, verilerin belirli bir konuda fiziksel olarak nasıl bölümlere ayrıldığını belirler. Bu sayede, Broker'lar verileri bölümler halinde yönetebilir ve böylece verilerin büyük ölçekte işlenebileceği bir platform sağlanır. Partisyonlar, bir konuda depolanan verileri kendi aralarında küçük parçalara ayırır ve böylece bir konudaki veriler daha hızlı ve etkili bir şekilde işlenebilir. Partisyonlar, verilerin farklı sunucular arasında nasıl paylaşıldığını belirlemek için kullanılır ve verilerin yük dağılımı için anahtar rol oynar.

Partisyonlar, bir konuda depolanan verilerin güvenilirliğini ve skalasını artırmanın yanı sıra, paralel işleme için de idealdir. Ayrıca, partisyonlar belirli bir konuda depolanan verilerin farklı sürümlerini takip etmek için de kullanılır. Bir partisyonun kapasitesi sınırlı olduğundan, verilerin bölümlere ayrılması önemlidir. Partisyonlar, bir konudaki verilerin performansını ve ölçeklenebilirliğini artırdığı için, Kafka'nın temel bileşenidir.

Bir partisyonun birden çok kopyası olabilir ve bu kopyalar, verilerin kaybedilmesini önlemek için yedeklenir. Partisyonlar, Kafka'da verilerin nasıl işlendiğine ve depolandığına dair birçok fayda sağlar ve verilerin büyük ölçekte işlenebileceği bir platform sağlar.


Kafka Consumer ve Producer API'ları

Kafka, özel Consumer ve Producer API'ları sağlar. Kafka Consumer API'si, Kafka topic'indeki mesajların tüketilmesi için kullanılır. Consumer API'si, bir konudan mesaj alan bir veya daha fazla Kafka tüketicisinin oluşturulmasını sağlar. Tüketiciler, konudaki herhangi bir mesajı okuyabilir ve buna göre işlem yapabilirler. Kafka Producer API'si ise, Kafka topic'ine mesaj yazan uygulamalarda kullanılır. Bu API, Kafka'ya bağlı bir üretici oluşturmayı sağlar. Üretici, belirli bir konu için mesaj üretir ve bunları Kafka broker'ına gönderir. Kafka broker'ı, bu mesajları tüketicilere veya diğer sistemlere yayınlar.

Kafka Consumer ve Producer API'ları, Kafka'nın esnekliğini arttırmak için birçok parametre sağlar. Örneğin, Consumer API'si otomatik olarak kaydedilen işaretleri takip etmek ve hızlı ve doğru bir mesaj tüketimi sağlamak için gruplandırılmış tüketicilere izin verir. Aynı şekilde, Producer API'si, ölçeklenebilirlik ve yüksek kullanılabilirlik sağlamak için birçok parametre ile yapılandırılabilir. API'ler ayrıca çeşitli konfigürasyon seçenekleri sunar, böylece uygulamanın özelliklerine göre yapılandırılabilirler.

Kafka'nın Consumer ve Producer API'ları, mesaj akışını hızlı ve güvenilir bir şekilde yönetmek için özel olarak tasarlanmıştır. Bu API'lar sayesinde, uygulamalar hızlı bir şekilde mesajları işleyebilir ve işlem sırasında herhangi bir önemli düşüş yaşamadan yüksek bir performans sağlayabilir.


Karşılaştırma

Mikroservislerin birbirleriyle iletişim kurarken kullandıkları RabbitMQ, ZeroMQ ve Apache Kafka araçları, farklı senaryolara uyarlanmış özelliklere sahiptir. Bu araçlar arasında yapılacak bir karşılaştırma, hangi senaryolarda hangi aracın daha uygun olduğunu belirlemek için oldukça önemlidir.

Karşılaştırma Kriterleri RabbitMQ ZeroMQ Apache Kafka
Senkronize Mesajlaşma Evet Evet Hayır
Async Mesajlaşma Evet Hayır Evet
Mesaj Yayınlama ve Abonelik Evet Hayır Evet

Tabloda da görüldüğü gibi, senkronize mesajlaşmada RabbitMQ ve ZeroMQ daha avantajlıdır. Apache Kafka ise daha çok async mesajlaşma için tasarlanmıştır. Mesaj yayınlama ve abonelik içinse RabbitMQ ve Apache Kafka daha uygun seçeneklerdir. Bu nedenle, mikroservislerin farklı senaryolarına göre uygun araçların seçimi oldukça önemlidir.


Karşılaştırma 1: Senkronize Mesajlaşma

Karşılaştırma 1: Senkronize Mesajlaşma

RabbitMQ ve ZeroMQ senkronize mesajlaşma için özelleştirilmiştir. İki arasındaki temel fark, RabbitMQ'nun bir mesaj ortamına odaklanması, ZeroMQ'nun ise küçük mesajlar için tasarlanmasıdır. ZeroMQ kullanarak, aracıya ihtiyaç duymadan doğrudan process-to-process iletişimi gerçekleştirebilirsiniz. Öte yandan, RabbitMQ, verimlilikten ödün vermeden çok sayıda aboneye mesaj göndermenize izin verir.

Özellik RabbitMQ ZeroMQ
Mesaj Ortamı Evet Hayır
Abonelik Evet Hayır
Boyutta Sınır Hayır Evet
Protokol AMQP Custom

Özet olarak, her iki araç da senkronize mesajlaşma için farklı amaçlarla tasarlanmıştır. ZeroMQ, hafif yapısıyla küçük ölçekli uygulamalar için uygundurken, RabbitMQ daha büyük ve ölçeklenebilir uygulamalar için daha uygun bir seçenektir.


Karşılaştırma 2: Async Mesajlaşma

Eşzamansız mesajlaşma, mikroservislerin birbirleriyle iletişim kurmasında yaygın bir yol olarak kullanılır. Bu tür mesajlaşma, gönderildikleri düzenleme sırasında işlenmeleri için mesajlar gönderir ve mesaj alan uygulamanın cevap süresini hızlandırır.

RabbitMQ için, eşzamansız mesajlaşma için özel olarak tasarlanmış AMPQ protokolü kullanılır. Bu protokol, mesaj alıcısı yerine belirli mesajlar için bir güvenlik önlemi olarak yer tutmaktadır. Mesaj alıcısı daha sonra mesajları işler ve bunun ardından RabbitMQ'ya bir yanıt verir. Bu işlem RabbitMQ tarafından takip edilir ve yanıt alındığında mesajlar silinir.

Kafka, eşzamanlı mesajlaşma için idealdir. Kafka, bir uygulamanın verileri birkaç versiyon önceden okumasına izin verir ve bunları sonlandırma veya yenileme işlemi yapmadan hızlı bir şekilde teslim eder. Ayrıca, mesajların tutarlılığını sağlamak için Consistency-Hashing-based Kafa-topics kullanır. Bu, belirli bir mesajın aynı sanal konuya neredeyse her zaman atandığı anlamına gelir ve böylece uygulama gecikmeleri minimize edilir.

Eşzamansız Mesajlaşma RabbitMQ Kafka
Protokol AMPQ Consistency-Hashing-based Kafka-topics
Performans Ortalama Yüksek
Veri Okuma Teknik olarak mümkün Mümkün

Karşılaştırma 3: Mesaj Yayınlama ve Abonelik

Karşılaştırma 3: Mesaj Yayınlama ve Abonelik

RabbitMQ ve Apache Kafka, mesaj yayınlama ve abonelik için özel olarak tasarlanmıştır.

RabbitMQ Apache Kafka
Yayın: Konular Konular
Abonelik: Kuyruk Tüketici grubu

RabbitMQ'nun mesaj yayınlama işlevi, "konu" adı verilen bir mekanizma kullanır. Bu konu, bir yayınlayıcıdan gelen mesajları alan birden fazla aboneliğe sahip olabilir. Bir mesaj yayınlandığında, sadece bir tüketici mesajı alır ve diğer aboneler mesajı alamaz.

Apache Kafka'da ise, mesajlar tüketici grupları arasında dağıtılır. Tüketici grupu, Kafka tarafından tutulan bir belirteç kümesiyle tanımlanır. Her grubun hangi parçalardan veri okuyacağı belirlenir. Farklı tüketiciler aynı konudan mesajlar okuyabilirler ve aynı anda verileri işleyebilirler.