← Back to Blog
MIMARI

Message Queue Nedir?

F. Çağrı BilgehanFebruary 15, 202612 min read
message queuerabbitmqkafkaasenkron

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

  1. Idempotent tüketici yazın — Aynı mesaj tekrar geldiğinde sorun çıkmamalı
  2. Dead Letter Queue (DLQ) kullanın — İşlenemeyen mesajları ayırın
  3. Retry mekanizması ekleyin — Geçici hatalarda yeniden deneyin
  4. Monitoring kurun — Kuyruk derinliğini ve tüketim hızını izleyin
  5. 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.

Related Posts

Yazılım Mimarisi Nedir? Temelden İleri Seviyeye Kapsamlı Rehber

Yazılım mimarisi nedir, neden önemlidir ve nasıl öğrenilir?

ADR Nedir? Yazılım Mimari Kararlarını Belgelemenin Önemi

Architecture Decision Records (ADR) nedir?