Mesaj Kuyrukları (Message Queue) Nedir? Pizza Dükkanı Üzerinden Anlamak

Bu yazıda, sistem tasarımında çok kritik bir kavram olan message queue (mesaj kuyruğu) mantığını gerçekten anlayacaksın. Sadece tanım değil, neden kullanılır, hangi problemi çözer ve gerçek sistemlerde nasıl iş görür, hepsini net şekilde kavrayacaksın.

Aynı Anda Gelen İşlerle Nasıl Başa Çıkılır?

Şimdi şöyle bir düşün…

Bir pizza dükkanına girdin. Sipariş verdin. Ama sana pizza hemen verilmiyor. Onun yerine:

“Siparişin alındı, biraz bekle” deniyor

Aslında burada çok kritik bir şey oluyor.

Asenkron çalışma (Asynchronous processing)

Yani şöyle düşün:

Sistem sana sonucu hemen vermek zorunda değil

Sadece “işin sıraya alındı” bilgisini veriyor

Sen beklerken başka iş yapabiliyorsun.

Telefonuna bakıyorsun, dışarı çıkıyorsun vs.

Bu ne demek biliyor musun?

Sistem seni bloklamıyor (bekletmiyor)


Kuyruk Mantığı (Queue) Nasıl Çalışır?

Pizza dükkanında bir liste var:

  • Sipariş 1
  • Sipariş 2
  • Sipariş 3

Ve bu liste sırayla işleniyor.

Bu aslında tam olarak bir queue (kuyruk).

Yani şöyle düşün:

Kasada sipariş alınıyor → mutfakta sırayla hazırlanıyor

Önemli nokta şu:

Sipariş almaya devam ediyorsun

Ama işlemleri sırayla yapıyorsun

Bu sayede sistem hem hızlı hissediliyor hem de kontrol edilebilir oluyor.


Önceliklendirme (Priority) Neden Önemli?

Şimdi biraz daha ileri gidelim.

Her sipariş aynı değil:

  • Bazısı acil (müşteri bekliyor)
  • Bazısı kolay (sadece kola doldurmak gibi)

Bu durumda ne yaparsın?

Öncelik verirsin

Bunu şöyle hayal edebilirsin:

Kuyruk var ama bazı işler “öne alınabiliyor”

Yani sistem sadece sıraya göre değil, öneme göre de karar verebiliyor.


Sistem Büyüdüğünde Ne Olur?

Şimdi iş büyüdü diyelim…

Artık tek pizza dükkanı yok. 3 tane şube var.

Ama bir problem çıktı:

Şubelerden biri çöktü (örneğin elektrik gitti)

Peki o şubedeki siparişler ne olacak?


Basit Liste Yetmez — Kalıcı Veri (Persistence) Gerekir

Eğer siparişler sadece RAM’de tutuluyorsa:

Sistem kapanınca her şey gider

Bu yüzden ne gerekir?

Database (veritabanı)

Yani şöyle düşün:

Siparişler sadece akılda değil, deftere de yazılıyor

Böylece:

  • Sistem çökse bile veri kaybolmaz
  • Diğer şubeler devam edebilir

Fail Durumu: Çöken Sunucular ve Yeniden Dağıtım

Diyelim ki bir sunucu çöktü.

O sunucuda işlenen siparişler:

Yarım kaldı

Bu durumda sistem ne yapmalı?

Bu işleri başka sunuculara vermeli

Ama burada bir risk var:


Büyük Problem: Duplicate İşler (Aynı İşin İki Kez Yapılması)

Şimdi kritik noktaya geldik.

Diyelim ki bir sipariş zaten işleniyordu ama:

  • Sistem bunu fark etmedi
  • Aynı işi başka sunucuya da verdi

Sonuç?

❌ Aynı pizza iki kere yapıldı

❌ Maliyet + karışıklık


Çözüm: Load Balancing ve Consistent Hashing

Bu problemi çözmek için kullanılan tekniklerden biri:

Load Balancing

Ama sadece yük dağıtmak değil…

Aynı işi tekrar göndermemek de önemli

Burada devreye giriyor:

Consistent Hashing

Bunu şöyle hayal edebilirsin:

Her sunucunun kendine ait bir “iş alanı” var

Bir sunucu giderse → sadece küçük bir kısmı diğerlerine dağıtılıyor

Yani tüm sistem yeniden karışmıyor.


Heartbeat Mekanizması Nedir?

Peki sistem bir sunucunun öldüğünü nasıl anlıyor?

Heartbeat (nabız kontrolü) ile

Yani şöyle düşün:

Sistem her 15 saniyede bir “yaşıyor musun?” diye soruyor

Cevap yoksa → “öldü” kabul ediyor

Sonra ne yapıyor?

O sunucunun işlerini alıp diğerlerine dağıtıyor


Tüm Bu Karmaşıklığı Kim Yönetiyor?

Buraya kadar fark etmişsindir…

  • Kuyruk var
  • Veritabanı var
  • Load balancing var
  • Heartbeat var
  • Retry mekanizması var

Bunların hepsini tek tek yazmak:

Aşırı kompleks

İşte burada devreye giriyor:

Message Queue (Mesaj Kuyruğu)
Aslında bu çok basit:

İşleri alır

Saklar

Doğru sunucuya verir

Tamamlanana kadar takip eder

Eğer bir sunucu cevap vermezse:

İşi başka sunucuya verir

Yani tüm karmaşıklığı kapsüller.


Gerçek Hayatta Kullanılan Araçlar

Bu mantığı implement eden sistemler var:

  • RabbitMQ
  • ZeroMQ
  • JMS (Java Messaging Service)
  • AWS’in queue servisleri (SQS gibi)

Bunlar sana şunu sağlar:

Komple sistemi sıfırdan yazmana gerek kalmaz


Özet

Aslında tüm olay şuna dayanıyor:

Bir sistemi daha ölçeklenebilir, daha dayanıklı ve daha hızlı hissettirmek istiyorsan, işleri doğrudan yapmak yerine sıraya alman gerekiyor. Mesaj kuyrukları tam olarak bunu yapıyor. Kullanıcıyı bekletmeden işi sıraya koyuyor, arka planda işliyor, hata olursa yeniden deniyor ve sistemi çökse bile ayakta tutuyor. Büyük sistemlerin çoğunda bu yüzden message queue görmek çok normal.


Bu yazı What is a MESSAGE QUEUE and Where is it used? videosundan ilham alınarak yazılmıştır.


Kaynakça:

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir