Mesaj Kuyrukları — Broker, Producer, Consumer ve Etkileşimleri
Bir önceki yazıda giriş yapıp yüzeysel olarak mesaj kuyrukları, producer, consumer ve mesaj kuyruklarını ne amaçla, ne zaman kullandığımızdan bahsetmiştim. Bu yazıda ise implementasyon yaparken aklınızda olması gereken bazı detaylardan bahsedeceğim, bunlar producer ve consumer kavramlarının birbirleriyle iletişimini, etkileşimini ve broker kavramını ele alacak.
Mesaj Kuyruklarının Çalışma Yapısı
Mesaj kuyrukları, mesajı üreten — producer ve mesajı tüketen — consumer arasındaki iletişimi sağlayan yapıdır. Bu konseptteki her kavramın farklı bir sorumluluğu vardır ve hepsi birbirinden oldukça soyutlanmış, ayrıştırılmış olmalıdır.
Mesaj kuyruğundan sorumlu yapı — Broker
Mesaj kuyrukları temelde bahsedildiği gibi basit bir yapıya sahiptir, bu yapı mesajı almak, mesajı sıralamak ve mesajı consumer’a ulaştırmak. Bazı mesaj kuyruğu sistemleri burada bahsettiğim kadar kolay programlanabilir veya anlaşılabilirlikte olmayabilir. Mesajın producer’dan alınma ve consumera iletme yöntemi, kalıcılık, güvenlik gibi ek özelliklerle bu kuyruk sistemi temelden daha komplike bir hale gelebilir.
Mesaj brokerları(aracı sistem), producer ve consumer arasındaki iletişim süreci arasında yer alan ve bu süreci yöneten kavramdır. Temelde görevi mesajları producer’dan almak ve consumer’a iletmek. Brokerlar esnek bir özelleştirme sunmaz, çalışma prensibi bir çerçeve içerisinde belirlenmiştir fakat o çerçeve içerisinde esnek bir konfigürasyon sunabilir.
Brokerlar şu özelliklere de sahip olabilir:
- Güvenlik, yetkisi olmayan bir producer’ın kuyruğa mesaj bırakamaması — Permissions
- Mesajları doğrulama — Message validation
- Hata durumunda kurtarma — Failure recovery
- Mesajları yönlendirmenin kurallandırabilir olması — Message routing rules
- Producer ve Consumer arasındaki iletişim yöntemlerine göre konfigüre edilebilme
Brokerlar için bu bahsedilenlerden daha önemlisi her zaman ulaşılabilir olmasıdır, yoksa producer, consumer iletişimi kopar ve bu hiç istenmeyen bir durumdur. Ayrıca throughput(verimli) bir iletişim yöntemine sahip olmalıdır ve eşzamanlı(concurrent) çalışabilmesi için oldukça iyi optimize edilmelidir.
Mesaj tüketicileri — Consumer
Tüketicilerin ana görevi mesajı kuyruktan edinmek ve onu işlemek. Consumer yapıları, producer’dan tamamen soyutlanmış olmalıdır. Consumer’ın producer’a dair hiç bir şey bilmesine gerek yoktur, Producer’ın veri kaynağına ulaşmak veya onun davranışlarını bilmek gibi saçma sapan işlere bulaşmamalıdır. Tek bilmesi gereken şey Producer’dan gelecek mesajdır. İyi soyutlanmış tüketiciler hem yönetim açısından hem de altyapınızdaki diğer bileşenler tarafından kolayca kullanılabilen bağımsız yapılar olarak sizin işlerinizi halleden bir hizmet yapısı olacaktır ve bu soyutlamayı bozmadığınız sürece bir developer olarak başınıza dert almayacaksınızdır.
Mesaj üreticileri — Producer
Producerlar asenkron olarak işlenecek mesajın çıkış noktasıdır, yani kuyruğa mesajı bırakan yapıdır. Gayet basit bir sorumluluğa sahiptir, bu da işlenebilir bir mesaj üretmek ve bunu mesaj kuyruğunda yayınlamaktır. Producer kavramı publisher olarak da bilinir.
Biz geliştiriciler, bir mesajın bir sistemde nerede üretileceğini belirleriz. Mesajlar uygulamanın farklı bölümlerinden üretilebilir ve kuyruğa farklı noktalardan gönderilebilir. Bu mesajlar aynı consumer veya farklı consumer gruplarına yönelik olabilir, örneğin bazı işlenmesi gereken mesajlar Order servisi içinken, bazı mesajlar hem Order hem de Inventory servisi için olabilir.
Consumer’in kuyruk ile iletişim için kullandığı yöntemler
Consumer’in mesajları işlemesi için ilk önce mesajları kuyruktan edinmesi gerekir, peki bunu nasıl yapar? Consumer’ın kuyruktaki mesajlardan haberdar olması için iki farklı yöntem var, bunlar pull ve push.
Pull ile iletişim
Bu iletişim şeklinde consumer kuyruğa zaman aralıklarıyla bağlanır ve kuyruğu kontrol eder, yeni bir mesaj var mı diye bakar ve varsa o mesajı alıp işleyerek kuyruğa bildirimde bulunur. Bu iletişim yöntemi genelde ağ bağlantılarında problem olabileceği durumlarda, stabil bir network olmadığı bir senaryoda veya consumer’ın işlem yaptığı kuyruğa sıklıkla mesaj bırakılmadığı durumlarda tercih edilir. Bu iletişim yöntemi polling diye de bilinir.
Push ile iletişim
Bu iletişim şeklinde Pull’un aksine consumer’ın aralıklarla kuyruğa bağlanıp mesajları okuması beklenmez. Producer kuyruğa bir mesaj bıraktığında Broker sürekli açık bir bağlantı üzerinden Consumer’ı yeni mesajın geldiği ile ilgili bilgilendirir ve ona mesajı yollar. Mesajların broker tarafından consumer’a yollanma hızı konfigürasyonlar ile ele alınabilir. Bu iletişim yöntemi, genellikle gerçek zamanlı veri iletimi gerektiren yapılarda kullanılır
Sonuç
Mesaj kuyruğundaki broker, producer ve consumer kavramlarını detaylandırmaya çalışarak, brokerların genel anlamda nelerden sorumlu olabileceği, consumer ve producer kavramlarının birbirlerinden ne kadar soyutlaştırılmış ve birbirlerinden bağımsız olursa sisteminiz için o kadar iyi olacağından, onların pull ve push gibi temel iletişim yöntemlerinden bahsettim.
Bir sonraki yazıda ise günümüzde bir çok problemin çözümü için bolca kullanılan publish, subscribe — karmaşık, hata toleransı düşük olan ve yüksek yük altında olabilecek senaryolar için olan custom routing ile asenkron iletişim üzerine yazacağımı düşünüyorum.