Message Broker Nedir?
You can access the English version via this link.
Message broker uygulamaların birbiri ile iletişime geçebilmesini sağlayan bir bileşendir. Bir uygulamadan aldığı mesajları başka bir uygulamaya ileterek uygulamalar arasında bilgi alış verişini sağlamaktadır.
Queue bir veri yapısı biçimidir. Bu yapıyı gerçek hayattaki banka kuyruğu, sinema bileti almak için oluşturulmuş kuyruklar gibi düşünebilirsiniz. Kuyruğa ilk giren kişi hizmeti ilk alan kişi olacaktır. Bu veri yapısından kısaca bahsetmemizin sebebi message broker’in çoğunlukla bu yapıyı benimsiyor oluşudur. Bu sebeple message broker ile message queue aynı şey olmasalar da, sıkça birbirinin yerine kullanılan kelimelerdir. Bu duruma en iyi örnek RabbitMQ message broker’i olacaktır. RabbitMQ isminin sonundaki MQ message queue anlamına gelir.
Üretici (producer): Mesajların üretildiği bileşendir. Örneğin; bir web sitesinde hesap oluşturduğunuz zaman UserService kullanıcının oluşturulduğuna dair mesaj oluşturup message broker’e iletir. Bu örnek için UserService üretici rolünü üstlenmektedir.
Tüketici (consumer): Kuyruğa gelen mesajları izleyen bileşenimizdir. Kuyruktaki mesajları alıp işlemler yürütür. Bir önceki örneğimizi kullanacak olursak, kullanıcının oluşturulduğuna dair mesajı broker aracılığı ile okuyarak “Hoş Geldiniz” maili gönderen bir servisimizin olduğunu düşünebiliriz. İşlemi yürüten yani maili gönderen servisimiz bu örnek için tüketici rolündedir.
Message broker: Mesajları üreticiden alıp tüketiciye ileten bileşene verilen isimdir. Sahip olduğu kurallara göre mesajı gerekli kuyruklara iletir. Bu kuyruklar aracılığı ile de mesajı tüketiciye teslim eder. Kafka, RabbitMQ, ActiveMQ gibi bileşenler mesaj broker rolünü üstlenirler.
Message Broker Nasıl Çalışır?
Üreticiler belirlenen protokollerle mesajlarını message broker içerisinde yer alan exchange denen yapılara iletir. Exchange yapılarını message broker için giriş noktaları olarak düşünebiliriz. Exchange, mesajları belirlenen kurallara göre gerekli kuyruklara iletmekle görevlidir. Message broker’in doğru kullanımında mesajlar doğrudan kuyruklara gönderilmez.
Tüketiciler de mesaj kuyruklarıyla iletişim halindedir. Kuyrukları broker’in çıkış noktaları olarak görebiliriz.
RabbitMQ bu topolojiye çok benzer bir yapı ile çalışmaktadır. Herbir tüketicinin kendine ait kuyruğu vardır. Exchange üzerine gönderilen mesajların birer örnekleri bu kuyruklarda saklanmaktadır. Bir başka tüketici başkasına ait olan kuyruk üzerinden mesaj okumaz. Tüketici mesajı işledikten sonra bu mesajın bir işlevi kalmaz. Bu sebeple tüketicinin işlemi bittikten sonra kuyruktaki mesaj yok edilir.
Kafka ise yukarıdaki topolojiyi biraz daha farklı bir yapı ile sunmaktadır. Mesajlar ayrı kuyruklarda değildir. Buna karşın tüketiciler mesaj kuyrukları üzerinde kaldıkları yerleri kendi işaretleyicileriyle belirlerler. Tüketici bir mesajı işledikten sonra işaretçisini ilerletir. Başka bir tüketici de bu mesajı işleyebileceği için mesajlar kuyruklardan silinmez. İşaretçiler aracılığı ile birden fazla kuyruk varmış gibi bir davranış sergilenir.
Exchange Tipleri Nelerdir?
Direct ve fanout en çok kullanılan tiplerdir. Exchange ile iletişimde olabilecek kuyruk sayısına göre tipe karar verilir.
- Exchange sadece bir kuyrukla iletişime geçecek şekilde ayarlandıysa bu exchange direct-exchange olarak adlandırılır.
- Birden fazla kuyruk bir exchange’ye bağlanırsa ve gelen mesajların kopyaları bu kuyruklara dağıtılıyorsa fanout-exchange tipini kullanıyoruz demektir.
Message Broker Kullanmanın Yararları Nelerdir?
Mesajlaşma sistemleri genellikle ölçeklenebilir sistemlerdir. Yükünüz arttıkça mesajlaşma sisteminize gereken kaynakları tahsis ederek bu yük ile başa çıkmak kolaydır.
Farklı uygulamaları düşük bağımlılıkla geliştirmek için mesajlaşma sistemlerinden faydalanılabilinir. Örneğin; satın alma işleminin tamamlanmasıyla başlayacak fatura süreçlerini message broker üzerinden tetikleyebilirsiniz. Bu şekilde sipariş yönetimi uygulamanız ile muhasebe uygulamanız birbiri ile doğrudan iletişime geçmediği için ayrı ayrı geliştirilebilir olurlar.
Kaynakların daha verimli kullanılması noktasında da mesajlaşma sisteminin katkısı oldukça yüksektir. Kullanıcıdan bir talep aldığımızı ve ağır bir işlem yürüttüğümüzü düşünelim. Bu durumda kullanıcıyı çok fazla bekletmemek için güçlü makinalar kullanmamız gerekir. Halbuki anlık olarak cevap vermek zorunda değilsek kullanıcıdan talebini alıp onu bekletmeden talebinin alındığına dair bir cevap verebiliriz. Bu sayede istek yanıtlama süremiz daha kısa olacaktır. Ayrıca asenkron bir süreç yarattığımız için daha düşük güçteki makinalarla talebi yerine getirme fırsatımız olur.
Mesaj Tipleri Nelerdir?
İki tip mesajdan bahsedebiliriz; olay (event) ve emir (command).
Olay mesajları bir olayın gerçekleştiğini tüm uygulamalara duyurmak için mesajlaşma sistemine iletilen mesajlardır. Olayın tamamlanmasının ardından yayımlandığı için mesaj isimlerinin geçmiş zaman eki ile bitmesi önerilir. SiparişTeslimEdildi adındaki mesaj buna bir örnek olabilir. Olay mesajları tüm sisteme bildirileceği için fanout-exchange’e iletilir. Mesajın tüm sisteme yayılması sebebiyle message broker ile iletişim yayımla (publish) metoduyla gerçekleşir.
Emir mesajları bir talebin yerine getirilmesi için tüketicinin tetiklenmesi amacıyla message broker’e iletilen mesajlardır. Yürütülecek işleme ait yüklemin mesajın adında geçmesi önerilir. HesapYarat adındaki mesaj emir mesajına örnek olabilir. Emirler tek bir tüketici tarafından işlenir. Bu sebeple emir mesajları direct-exchange tipinden exchange yapılarına iletilirler. Broker ile iletişim gönder (send) metoduyla yürütülür. Çünkü bu durumda mesajın kime iletileceği bellidir. Bu mesaj tipi için genel bir yayımlama işlemi yerine belirli bir alıcıya gönderim işlemi yapılmaktadır.
Umarım yararlı bir yazı olmuştur. Diğer yazılarıma da profilim aracılığı ile erişebilirsiniz.