Message Queue Nedir? Asenkron İletişim Rehberi
Mikro servisleriniz birbirini bekliyor mu? Yoğun trafik altında kayıplar mı yaşıyorsunuz? Message Queue ile sistemlerinizi birbirinden bağımsız, dayanıklı ve ölçeklenebilir hale getirin.
Message Queue Tanımı
Message Queue (Mesaj Kuyruğu), uygulamalar arasında asenkron iletişim sağlayan bir ara katmandır. Üretici (producer) mesajı kuyruğa bırakır, tüketici (consumer) hazır olduğunda alır ve işler.
Senkron: Servis A ──────→ Servis B (bekle!) ──────→ Yanıt
Asenkron: Servis A ──→ Queue ──→ Servis B (hazır olunca)
↑
Mesaj güvende
Neden Message Queue?
1. Gevşek Bağlantı (Decoupling)
Servisler birbirine doğrudan bağımlı değildir. Biri çökerse diğeri çalışmaya devam eder.
2. Yük Dengeleme
Anlık trafik artışlarında mesajlar kuyrukta birikir, tüketiciler kendi hızlarında işler.
3. Dayanıklılık
Mesajlar kalıcı olarak saklanır. Tüketici çökse bile mesaj kaybolmaz.
4. Ölçeklenebilirlik
Birden fazla tüketici ekleyerek işleme kapasitesini artırabilirsiniz.
Temel Mesajlaşma Desenleri
Point-to-Point (Kuyruk)
Bir mesaj yalnızca bir tüketici tarafından işlenir:
Producer → [Queue] → Consumer A
→ Consumer B (sıradaki mesajı alır)
Pub/Sub (Yayın/Abone)
Bir mesaj tüm abonelere iletilir:
Publisher → [Topic] → Subscriber A (kopyayı alır)
→ Subscriber B (kopyayı alır)
→ Subscriber C (kopyayı alır)
RabbitMQ vs Apache Kafka
| Özellik | RabbitMQ | Apache Kafka | |---------|----------|-------------| | Model | Geleneksel kuyruk | Log tabanlı stream | | Performans | 10K msg/s | 1M+ msg/s | | Mesaj saklama | İşlendikten sonra sil | Süresiz saklama | | Sıralama | Kuyruk düzeyinde | Partition düzeyinde | | Kullanım | Task queue, RPC | Event streaming, ETL | | Protokol | AMQP | Kendi protokolü |
RabbitMQ Örneği
// Producer
const amqp = require('amqplib');
const conn = await amqp.connect('amqp://localhost');
const channel = await conn.createChannel();
await channel.assertQueue('orders');
channel.sendToQueue('orders', Buffer.from(JSON.stringify({
orderId: 123,
items: ['laptop', 'mouse'],
total: 15000
})));
// Consumer
channel.consume('orders', (msg) => {
const order = JSON.parse(msg.content.toString());
console.log('Sipariş alındı:', order.orderId);
// Siparişi işle
processOrder(order);
// Mesajı onayla
channel.ack(msg);
});
Kafka Örneği
// Producer
const { Kafka } = require('kafkajs');
const kafka = new Kafka({ brokers: ['localhost:9092'] });
const producer = kafka.producer();
await producer.send({
topic: 'user-events',
messages: [
{ key: 'user-42', value: JSON.stringify({ event: 'purchase', amount: 500 }) }
]
});
// Consumer
const consumer = kafka.consumer({ groupId: 'analytics-group' });
await consumer.subscribe({ topic: 'user-events' });
await consumer.run({
eachMessage: async ({ topic, partition, message }) => {
const event = JSON.parse(message.value.toString());
console.log('Event:', event);
}
});
Yaygın Kullanım Senaryoları
1. E-posta Gönderimi
Sipariş onayından sonra e-postayı kuyruk ile gönderin. Kullanıcı e-posta gönderilmesini beklemez.
2. Sipariş İşleme
Ödeme, stok, kargo adımlarını sırayla kuyruklarla yönetin.
3. Log ve Analitik
Uygulama loglarını Kafka üzerinden toplama ve analiz platformuna akıtma.
4. Bildirim Sistemi
Push notification, SMS, e-posta bildirimlerini asenkron gönderin.
Best Practices
- Idempotent tüketici yazın — Aynı mesaj tekrar geldiğinde sorun çıkmamalı
- Dead Letter Queue (DLQ) kullanın — İşlenemeyen mesajları ayırın
- Retry mekanizması ekleyin — Geçici hatalarda yeniden deneyin
- Monitoring kurun — Kuyruk derinliğini ve tüketim hızını izleyin
- Mesaj boyutunu küçük tutun — Büyük veriler için referans (pointer) gönderin
Sonuç
Message Queue, modern dağıtık sistemlerin temel yapı taşıdır. Asenkron iletişim, dayanıklılık ve ölçeklenebilirlik sağlar. Doğru seçim projenizin ihtiyaçlarına bağlıdır: Basit task queue için RabbitMQ, büyük ölçekli event streaming için Kafka.
Mesaj tabanlı mimariyi LabLudus platformunda interaktif olarak öğrenin.