Messager broker, birçok uygulama arasında iletişimi sağlamasına yarayan bir bileşendir.

Örneklerle anlatacak olursak mesaj kuyruklamasına yarayan bir yapıdır.En çok kullanılanı RabbitMQ’dur.

Message broker ne işe yarar nasıl kullanılır, mesaj kuyruklamasını sağlamaktadır. En basit örnek verecek olursak

Whatshapp kullanıcısı mesaj atar karşı taraf internete erişimi yok ise o mesaj kuyruğa girer. Kuyruklama yapısın da en hızlı ve en stabil şekilde karşı tarafa gitmesini sağlayabilmek için kullanılır. Mesajlarımız karşı tarafa mesajı attığımız sıra şekliyle gidecektir. Bir oyunun içerisindeyken internet bağlantınız koptuğu zaman karşı taraftandan gelen hareketler kuyruğa girer ve siz tekrar bağlantı sağladığınız zaman kuyruktan iletilir.

Message Broker sistemi 3 parçadan oluşur;

Producer(üretici):Bu alanda mesajlar üretilir.Örn;Bir siteye girdiniz yeni bir kullanıcı açtınız. Arkada çalışan UserService yeni kullanıcıyı Message Broker’a iletir.

Consumer(tüketici):Bu kısımda kuyruğa gelen mesajlar izlenir. Kuyruktaki mesajları yürütür. UserService’den gelen mesaj işleme alınıp sonuç verdiği kısımdır. Kayıt Başarıyla tanımlandı mesajını oluşturan kısımdır.

Message Broker: Bu kısım kuyruklama yapısıdır. Mesajları alıp bu kısımda sıraya sokar. User maili onayladığın da bu kuyruk yapısından onay mesajı Consumer’a iletilir.

Neden Message Broker Kullanmalıyız?

*Mesajlaşma sistemleri genellikle sisteme çok yük bindiren kaynaklarımızı fazla kullanan sistemlerdir. Bu mesajları kuyruk yapısına aldığımız da kaynaklarımızın tüketimi azalır.

*Bir siteniz var bu site satış üzerine uygulamalar var. Bu kısımda nasıl yarar sağlarsınız bir ürün satıyorsunuz bu ürünü faturalandırma kısım kullanıcı daha satın alma sürecindeyken kuyruk yapısına fatura girer satın alma işlemi sonlandırıldığında fatura otomatik kuyruktan kullanıcının önüne düşer.

*Sunucularınız veya uygulamanız sürekli giriş çıkış halinde veya log basma halinde bu sunucu veya sisteminizin kısa bir süre duraksaması halinde sunucu şişip patlayabilir bu yüzden kuyruk yapısına kullanarak belli süreli duraksamalar da bile sunucunuza yük bindirmeden çalışabilir.

Mesaj Tipleri?

2 tip mesaj tipi vardır; Olay(event) ve Emir(command)

Olay(event): Tüm uygulamalara mesajın gerçekleştiğini duyurmak adına sisteme iletilir.

Olay tamamlandıktan sonra sistem geçmiş zaman eki önerisi yapar.

Sipariş İadesi Tamamlandı gibi örnek verebiliriz.

Event message fanout-exchange’e iletir. Message broker iletişim yayımla metoduyla gerçekleşir.

Emir(command): Emir mesajları consumer’ın tetiklenmesi için message broker’a gönderilen mesajlardır.

Topic Exchange

Topix Exchange yapısında mesajların bir routing key değeri .(nokta) operatörünü kullanır, bu operatör ile listeleme yaparken bu operatörü kullanır ve mesajlar uygun kuyruğa gönderilir.

Yukarda görselde gördüğümüz gibi routing key= ‘tr.’ olanlar aşşağıda kendi binding key ‘tr.’ olanlar kısmına ulaşır.

RabbitMQ Nedir?

En ünlü message broker servislerinden biri olan RabbitMQ, oldukça kullanışlı open source bir kuyruk sistemidir.Mesajı bir uygulamadan alıp başka bir uygulamaya gönderme servisidir. İletmek  istediğimiz mesajları sırası ile zamanı geldiğinde ileten bir kuyruk yapısıdır.

RabbitMQ İşleyişi ?

Yukarıda ki şemada göründüğü gibi Publisher ve Consumer adında iki adet bileşene sahip Exchange ve Queue adında iki adet aracıları vardır.Bu yapılar neledir bunları inceleyelim.

Publisher

Günlük yaşantımıza örnek vermek gerekirsek postaneye gidip mektup veya benzeri eşyaları postaneye götüren insanlar olarak düşünebiliriz.RabbitMQ içerisinde publisher işi RabbitMQ servislerine gönderen öperatörlerdir.Günlük yaşantımıza devam edersekte mektupları aldıktan sonrasında postacıların sıralı bir şekilde posta sahiplerine gönderen postacılara benzetebiliriz.

Publisher Lifecyle : Publisherlar genelde tek bir oturum veya kanal açmaktan ziyade daha uzun ömürlü işlemlerde kullanılır. Bir uygulamayı başlatıldığı sırada başlayan publisherlar uygulama kapatılana kadar çalışmaya devam ederler.

Protocol Differences:

Mesajların kalkınma süreci RabbitMQ destekli bütün protokollerde benzer süre içindedir.

*AMQP 0-9-1

Bir veya birden fazla kuyruk yapısı ile değişim kısmını kaynak veya hedef değişimi arasında olan bağlantıların tanımlanmasıyla kurulan bir topolojidir.

*AMQP 1.0

Tek bir bağlantı üzerinden gerçekleşir.

*Unroutable Message Handling

İstemciler karşıda bir alıcı olmasa bile mesaj göndermeye çalışırlar. RabbitMQ yönlendirilemez mesajlar olsa bile bunları tespit etmek için RabbitMQ gerekli ölçümleri bize ulaştırır.

CONSUMER

Consumerlar kuyruktaki mesajların teslimi için hangi istemcinin çalışacağını seçmek için istemcilerin kütüphanelerinin kullanılan bir tanımlayıcıya sahiptir.Protokolden protokole isimleri değişir.Mesajların ulaşmasının yanı sıra etiketler sayesinde iptal etme seçeneğimiz de var.

Consumer Lifecycle

Consumer’lar uzun ömürlü olması için kurulan yapılardır. Tek seferlik için efektif değildir. Consumer’lar herhangi bir uygulamanızı başlatırken kaydedilir.

Connection Recovery

Bazen kuyruk yapısı durabilir bu gibi zamanlarda mesaj gönderimi durur. ASP.NET içerisinde bulunan kütüphaneler bağlantıyı otomatik şekilde kurtarmayı bize sunmaktadır.

Bağlantı kopması durumunda genellikle izlenilebilecek en sağlıklı yol sırasıyla; bağlantıyı, kanalları, kuyrukları, değişimleri, bağları ve tüketicileri kurtar komutlarıdır.

Message Types

Mesajların nasıl bir tipte ileti olduğunu karşı tarafa belirten bir dizedir. Mesajlar doğal olarak gruplara ayrılır nokta ile ayırma kuralı kullanılır

Exchange Nedir?

Exchange, gelen mesajları producer’dan alıp queue’ye gönderen servistir yani mesajların rotasını belirleyen kısımdır. Mesajları alıp exchange türlerine göre hangi yoldan gideceğine karar verilir.

Exchange Types:

*Direct Exchange

*Header Exchange

*Fanout Exchange

*Topic Exchange

*Alternate Exchanges

Direct Exchange

Exchange türleri arasında ki en basic tiptir. Mantığı tamamen Routing-Key olarak mesajı direkt queue’ya gönderir. Başlıklar içersinde ki routing key ile uyuştuğunda mesaj direkt queue aktarılır. Herhangi bir kendine uygun queue bulunmazsa mesaj boşa çıkar.

Header Exchange

Mesajları direct exchange gibi routing-key yapısıyla değil de başlığın değerine göre gönderir. Queue bağlanan değeri “x-match” anahtarına verilen “all” veya “any” değerine göre alır ve uygun queue iletir.

Fanout Exchange

Alınan mesajı tüm queue’lara gönderen tiptir. Bu exchange birçok queue’ya mesaj attırmak için uygun bir tiptedir. Örnek gösterecek olursak bir hamburgerci için hamburger siparişi geldi mesajını ilettikten sonrasında kuryenin hepsini bir arada çıkartması örneğini verebiliriz.

Alternate Exchanges

İstemcilerin mesajların herhangi bir kuyruk yapısına bağlı olmasa bu mesajların işlenmesini ister. Genel olarak bazı mesajlar herhangi bir hata yapılarak veya bilerek mesajlar yönlendirilmediğinde bu mesajların ne zaman yayınlandığını algılamak için kullanılır.

RabbitMQ’da yönlendirilemeyen mesajlar olmaktadır bunların tamamen kaybolmasını engellemek mümkündür. Mesaj başlığında ki bayrak ayarı ile mesajı true,false olarak döndürebilir. True yaptığında tekrardan döndürür, false yaptığında ise mesajı sessiz bırakır.

Alternate Exchange Veri Kaybını Önlemek

RabbitMQ içerisinde yönlendirilmez mesajlara Alternate Exchange ile bir mantık uygular ve bir alternatif seçenek sunar. Alternatif Değişim producer’dan gelen mesajı öncelik olarak bir exchange geçer eğer mesaj iletilemezse alternatif exchange üzerinden consumer’a ulaştırılır.

Proje içinde nasıl kullanılır?

Öncelikle sistemimize docker kurduktan sonra docker sunucusunu ayağa kaldırmamız gerekiyor.

Yukarıda ki kod ile direkt RabbitMQ’yu ayaklandırabiliriz.

Daha sonra local hostumuzu 15672 olarak yazdığımız için http://localhost:15672/ adresine gidip Username and password isteyen kısımla karşılaşıyoruz. Bu kısma guest guest yazdığımızda oturumumuz açılmış oluyor.

Sistemimize girdikten sonrasın kuyruklarımızı yönetebildiğimiz basit bir tasarıma sahip olan RabbitMQ arayüzü bizi karşılar.

RabbitMQ Arayüzünden bütün projenizin kuyruk yapısını takip edebildiğiniz exchange yapısını kanalları görüntüleyip rahatlıkla anlayabileceğiniz bir yapıya sahip.

.NET Basit Örnekler

Başlangıç olarak publisher mesaj atmasını sağlamak için RabbitMQ sunucumuza bağlantı oluşturuyoruz. Manage Nuget Packages for Solution kısmına Tıklayarak Browse kısmına RabbitMQ.Client yazarak .Net içinde ki RabbitMQ paketimizi projemize ekliyoruz.

Daha sonra ConnectionFactory sınıfımız  ile factory adında yeni bir nesne oluşturuyoruz. Daha sonrasında RabbitMQ servimizi localhost olarak kurduğumuz için HostName metodunu çalıştırıyoruz.

Mesaj atmak için bağladıktan sonrasında burada yeni bir kanal oluşturuyoruz.

Daha sonrasında öncelikle kuyruk adımızı oluşturuyoruz, mesajın byte[] olarak döndürülme sebebi RabbitMQ tipinde nesne kabul etmektedir. Basit bir kuyruk yapısını anlatmış olduk.

İlginizi Çekebilecek Makaleler​

LLM (Large Language Models) Nedir?

Günümüzde yapay zeka ve makine öğrenmesi, teknolojinin birçok alanında devrim niteliğinde ilerlemeler kaydetmiştir. Bu ilerlemelerin merkezinde yer alan büyük dil modelleri (LLM – Large Language

Devamı »
Message Broker Nedir?

Message broker, birçok farklı uygulama veya sistem arasında iletişim kurmak için kullanılan bir yazılım aracıdır. Bu araç, bir uygulama tarafından gönderilen mesajları bir veya daha

Devamı »
Loglama Nedir?

Loglama, bilgisayar sistemlerindeki olayları, hataları ve diğer önemli durumları kaydetme işlemidir. Bu kayıtlar, sistem yöneticileri ve geliştiriciler tarafından, sistemlerin işleyişini anlamak, hataları tespit etmek ve

Devamı »
Vcenter Üzerinden ESXI Upgrade’i Nasıl Yapılır?

Öncelikle herkese merhaba arkadaşlar, sizlere Vcenter üzerinde ESXI hostunuzu nasıl upgrade edeceğinizi anlatacağım. Öncelikle hangi versiyona yükselteceksek o versiyonun ISO dosyasını indiriyoruz. Ardından Vcenter’ımızı açıyoruz.

Devamı »