Bloga Dön
Özel Yazılım

Mesaj Kuyruğu Nedir? RabbitMQ ile Arka Plan İşleri

Mesaj kuyruğu (message queue) nedir, ne işe yarar? Üretici ve tüketici, RabbitMQ ile e-posta, fatura ve bildirim gibi işleri arka plana almak, onay (ack), tekrar deneme, ölü mektup kuyruğu, idempotency ve kuyruğun gereksiz olduğu durumlar.

Mesaj KuyruğuRabbitMQBackendMimari

Mesaj kuyruğu (message queue), bir uygulamanın yapılacak bir işi hemen yapmak yerine bir mesaj olarak bıraktığı ve başka bir sürecin o mesajı sırayla alıp işlediği ara katmandır. Kısa cevap: kullanıcıyı bekletmemesi gereken ya da dış bir sisteme bağlı olan işleri (e-posta, fatura kesme, bildirim, rapor üretme) web isteğinden ayırır; dış sistem yavaşladığında ya da çöktüğünde iş kaybolmaz, kuyrukta bekler. RabbitMQ bu iş için en yaygın kullanılan açık kaynak araçlardan biridir.

Mesaj kuyruğu nedir, nasıl çalışır?

Modelde üç parça vardır. Üretici (producer) işi tarif eden küçük bir mesaj gönderir, örneğin "42 numaralı sipariş için fatura kes". Aracı (broker), yani RabbitMQ, mesajı kalıcı olarak saklar. Tüketici (consumer) ayrı çalışan bir işçi süreçtir; mesajı alır, işi yapar ve bittiğini onaylar (ack). Onay gelmeden işçi çökerse aracı mesajı başka bir işçiye yeniden verir. Bu sayede web sunucusu siparişi kaydedip kullanıcıya hemen yanıt döner, fatura birkaç saniye sonra arka planda kesilir.

Mesaj kuyruğu hangi işlerde kullanılır?

  • E-posta ve SMS gönderimi: sağlayıcı yavaş yanıt verse bile kayıt ve sipariş ekranı beklemez.
  • Fatura ve resmi entegrasyonlar: e-fatura entegrasyonu gibi yanıtı gecikebilen dış servislerde tekrar deneme kuyrukla yönetilir.
  • Gelen webhook olayları: olay hemen kabul edilip kuyruğa atılır, işleme ayrıca yapılır; ayrıntısı webhook nedir yazısında.
  • Ağır işler: PDF ve rapor üretimi, görsel küçültme, toplu içe aktarma.
  • Servisler arası iletişim: bir servisteki olayı birden fazla servisin dinlemesi gerektiğinde.
Kuyruk işi kaybetmemeyi sağlar, ama iki kez yapılmamasını sağlamaz. Aynı mesaj bir kereden fazla gelebilir; bu yüzden her tüketici idempotent yazılmalı, yani aynı işi ikinci kez aldığında sonucu değiştirmemelidir.

Onay, tekrar deneme ve ölü mektup kuyruğu

Sağlam bir kuyruk kurulumunda üç karar baştan verilir. Birincisi onay: tüketici mesajı işi gerçekten bitirdikten sonra onaylar, almadan önce değil. İkincisi tekrar deneme: geçici hatalarda mesaj belirli bir bekleme süresiyle sınırlı sayıda yeniden denenir, sonsuz döngüye girmez. Üçüncüsü ölü mektup kuyruğu (dead letter queue): denemeleri tükenen mesaj ayrı bir kuyruğa düşer, orada izlenir ve sebep düzeltildikten sonra elle yeniden gönderilir. Ölü mektup kuyruğunda biriken mesaj sayısı mutlaka izlenmeli ve eşik aşıldığında alarm üretmelidir.

Aşağıdaki Node.js örneği, siparişten sonra faturayı kuyruğa atan üreticiyi ve onu işleyen tüketiciyi gösteriyor. Mesaj kimliği sipariş numarasıdır; tüketicideki createInvoiceOnce fonksiyonu aynı sipariş için ikinci fatura kesmez.

import amqp from 'amqplib';

const conn = await amqp.connect(process.env.AMQP_URL ?? 'amqp://localhost');
const ch = await conn.createChannel();
await ch.assertQueue('invoices', { durable: true });

// Producer: the web request only drops a message and returns.
export function enqueueInvoice(orderId: string) {
  ch.sendToQueue('invoices', Buffer.from(JSON.stringify({ orderId })), {
    persistent: true,
    messageId: orderId, // used for idempotency on the consumer side
  });
}

// Consumer: a separate worker process.
await ch.prefetch(5);
await ch.consume('invoices', async (msg) => {
  if (!msg) return;
  const { orderId } = JSON.parse(msg.content.toString());
  try {
    await createInvoiceOnce(orderId); // safe to run twice for the same order
    ch.ack(msg);
  } catch {
    ch.nack(msg, false, false); // goes to the dead letter queue
  }
});

RabbitMQ mu, Redis mi, Kafka mı?

RabbitMQ klasik iş kuyruğu için tasarlanmıştır: yönlendirme, onay, öncelik ve ölü mektup kuyruğu hazır gelir. Uygulamada zaten Redis varsa, düşük hacimli arka plan işleri için Redis tabanlı kuyruk kütüphaneleri yeterli olabilir; Redis'in diğer kullanımları için Redis nedir yazımıza bakabilirsiniz. Kafka ise mesajları uzun süre saklayan bir olay günlüğüdür; yüksek hacimli olay akışı ve aynı veriyi geriye dönük yeniden okuma gerektiğinde anlamlıdır, basit iş kuyruğu için fazladır. Seçimi araç popülerliği değil, mesajın ne kadar süre saklanacağı ve kaç tüketicinin okuyacağı belirler.

Mesaj kuyruğu ne zaman gereksizdir?

Her arka plan işi kuyruk gerektirmez. Belirli saatte çalışan rapor ya da temizlik işleri için zamanlanmış görev (cron job) daha basittir. Trafiği düşük, tek sunuculu bir uygulamada veritabanında bir "bekleyen işler" tablosu ve onu okuyan küçük bir işçi çoğu zaman yeterlidir. Kuyruk; izlenmesi, yedeklenmesi ve güncellenmesi gereken bir bileşen daha demektir. Uygulamayı servislere bölmeden önce mikroservis mi monolit mi sorusunu cevaplamak da aynı mantıkla önemlidir.

Sonuç

Mesaj kuyruğu, kullanıcıyı bekletmemesi gereken ve dış sistemlere bağlı işleri güvenli biçimde arka plana alır. Değerini onay, sınırlı tekrar deneme, ölü mektup kuyruğu ve idempotent tüketici birlikte kurulduğunda gösterir. Projenizde arka plan işlerinin nasıl kurgulanacağını birlikte değerlendirmek isterseniz özel yazılım sayfamıza bakabilir ya da teklif alın formundan bize yazabilirsiniz.

Projenizi Hayata Geçirelim

Web sitesi, mobil uygulama veya kurumsal yazılım projeniz için ücretsiz danışmanlık alın.

Ücretsiz Teklif AlÖzel Yazılım hizmetimizi inceleyin