Mesaj Kuyrukları — Giriş

Halil İbrahim Kocaöz
3 min readJan 23, 2024

Modern yazılım geliştirme yaklaşımlarında bazı yapılar için yazılımlar ve sistemler bütün olması yerine farklı katmanlara, servislere ayrıştırılarak dağıtılması gerekmektedir. Bu katmanlar, servisler web API uygulamaları, veritabanları, önbellekleme yapıları, serverless fonksiyonlar ve benzerleri olabilir. Bu gerekliliğin ölçeklendirmek gibi bir çok farklı sebebi olsa da o ayrıntılara girmek yerine, dağıtık olan sistemlerin birbirleri ile iletişim kurarken kullandığı yapıya odaklanacağım. Bahsedilen katman ve servislerin iletişiminde genelde asenkron olarak bir noktadan, bir veya birden çok farklı nokta ile iletişim kurması tercih edilen bir yaklaşım, ve bunun için mesaj kuyrukları süper bir çözüm.

Mesaj kuyrukları nedir?

Mesaj kuyruğu — Message queue, bir yapıda gerekli işlemlerin asenkron olarak yapılması için sıralanmasını, dağıtılmasını sağlayan bileşendir. Bir noktadan, bir veya birden çok noktaya işlenmesi, yapılması veya haberdar edilmesi amacıyla iletilen istekler mesaj kuyruğu ile iletilebilir. Çoğunlukla bu mesajlar JSON nadiren de olsa XML formatında olur ve yapılacak işe dair bütün bilgileri içermesi beklenir, aynı zamanda da yapılacak iş dışında fazladan veri barındırması istenmez.

Producer ve Consumer

Producer, mesaj kuyruğu tarafından tutulan ve daha sonra Consumer tarafından asenkron olarak işlenmeyi bekleyen mesajları üreten yapıdır. Kısaca Producer, mesajları kuyruğa ileten ve Consumer ise mesajları kuyruktan farklı yöntemler ile edinen ve onu işleyen yapı.

Soyut bir örneklendirme ile Producer ve Consumer

Senaryoda müşteri, restorana girip sipariş vererek producer rolünü oynar. Müşterinin siparişi, restoranda hazırlanacak olan yemeğin (mesajın) başlangıcını temsil eder. Müşteriler farklı siparişler (mesajlar) verir ve bu siparişler işlenmek üzere restoranın sisteminde yer alır.

Restoranın siparişlerinin yönetildiği sistem garson aracılığıyla işler, garson aslında kuyruk görevi görür, müşteriler tarafından verilen siparişler, bir sipariş sisteminde (örneğin, bir elektronik sipariş ekranında veya fiziksel sipariş defterinde) sıraya konur. Bu sistem, bir mesaj kuyruğuna benzer; çünkü burada siparişler (mesajlar) sıralı bir şekilde tutulur ve işlenmeyi bekler. Aşçı, bu kuyruktaki siparişleri sırayla alıp yemekleri hazırlar.

Bu durumda aşçı, sipariş sisteminden (mesaj kuyruğundan) siparişleri (mesajları) alıp yemekleri hazırlayan kişidir, yani consumer rolünü oynar. Aşçı, müşterilerin isteklerine göre yemekleri pişirir ve bu yemekler daha sonra garsonlar aracılığıyla yine farklı bir kuyruk yönetimi ile müşterilere ulaştırılır.

Bu soyut örneklendirme fikri için ChatGPT’den yararlanılmıştır.

Mesaj Kuyrukları kullanmanın avantajları

Yazının öncesinde bazı avantajlara değindim ama bunların neden avantaj olduğunu söylemedim, şimdiyse neden avantaj olduğu ile ilgili bilgiler ile genel sağladığı avantajlardan bahsedeceğim.

  1. Asenkron iletişim, senkron yapılarda request-reply, request-response gibi kavramlar ile iletişim kurulurken mesaj kuyrukları asenkron bir iletişim sağlar. Bu, bir sürecin diğer süreçleri beklemeden çalışmasına olanak tanır, böylece sistem performansını ve verimliliğini artırır.
  2. Sistemin farklı bileşenlerinin birbirlerine kolayca entegre olabilmesini veya bir sistemin, başka bir sisteme entegre olabilmesini sağlar. Teknoloji bağımsız esneklik ve farklı sistemler ile kolayca iletişimin önünü açar.
  3. Geçici arızaları tolere edebilmek, senkron olarak çalışan bir sistemde reply edecek sistem eğer çalışmıyor durumdaysa request’i atan sistemin de arıza vermesi, akışının bozulması gerçekleşebilir. Eğer isteği, mesaji consume edecek yapı o an çalışmıyorsa, producer tarafı bundan etkilenmeyecektir, mesaj consumer çalışmadığı için kuyrukta bekleyecektir ve consumer yapısı tekrardan çalışabilir hale gelince sistemin aksayan tarafı da çalışmaya devam edecektir.
  4. Reliability — Dayanıklılık sağlar, kırılganlığı azaltır. Yukarıda bahsettiğim gibi sistemin bir kısmı çökerse veya tamamı çökerse mesajlar kuyrukta bekleyecektir ve sistemin arıza yapan kısmı tekrardan çalışır duruma geldiğinde işlenmeye devam edecektir.
  5. Scalability — Ölçeklendirebilirliği kolaylaştırır. Sistemin iş yükü arttığında çok kolay bir şekilde sistemde mesajları işleyen veya üreten birimlere eklemeler yapılabilir.

Ölçeklendirme, kırılganlığı azaltma ve kolayca farklı sistemlere entegre olabilmesi gibi temel getirilerinden bahsettim.

Yazıda mesaj kuyruklarının nasıl implemente edilebileceğini dert etmeden genel bir giriş yaptım. Mesaj kuyrukları, sistemlerin birbirini beklemeden bağımsız olarak çalışmasına imkan tanıyarak performans ve verimliliği artırması, farklı teknolojiler ve mimariler arası entegrasyonu kolaylaştırması, sistem yükünün artması durumunda kolay ölçeklenebilirlik sunması gibi özellikleriyle, yazılım geliştirme dünyasında giderek daha fazla önem kazanan bir yaklaşımdan söz ettim.

Bu konuyla alakalı bir sonraki yazı broker, consumer ve producer kavramlarından bahsetmek, message streaming ve event sourcing kavramlarına bakmak olacaktır diye düşünüyorum. Eğer yazıyı yazmamış olursam veya merak duyuyorsanız siz kesinlikle bu bahsettiğim kavramların ayrıntılarına bakın.

--

--