Yan yana
Mesaj KuyruğuvsPub/Sub
Mesaj kuyruğu ile pub/sub arasındaki fark nedir?
Güncellendi 2 dk okuma6 fark
Kısaca
Mesaj kuyruğunda her mesaj tek bir tüketiciye gider, işçiler yükü paylaşır; pub/sub'da ise her mesaj her aboneye kopyalanır, böylece birçok servis tepki verir.
Mesaj Kuyruğu
Mesaj kuyruğu, bir servisten gelen mesajları bir başkası işlemeye hazır olana kadar saklayan ve sistemin parçalarını eşzamansız çalıştıran bir bileşendir.
Mesaj Kuyruğu sayfasını okuPub/Sub
Yayın-Abonelik (Publish-Subscribe)
Pub/sub, yayıncıların konulara mesaj gönderdiği ve bir konunun her abonesinin, iki taraf da birbirini tanımadan bir kopya aldığı bir mesajlaşma kalıbıdır.
Pub/Sub sayfasını okuMesaj Kuyruğu ve Pub/Sub karşılaştırması
| Özellik | Mesaj Kuyruğu | Pub/Sub |
|---|---|---|
| Mesajı kim alır | Tam olarak bir tüketici | Her abone bir kopya alır |
| Asıl amaç | İşi işçiler arasında paylaştırmak | Olayları birçok servise yaymak |
| Tüketici eklemek | Aynı işi daha çok işçiye yayar | Her olayı duyan bir servis daha ekler |
| Tüketici çevrimdışıyken | Mesajlar kuyrukta bekler | Aboneliği kalıcı değilse mesajları kaçırabilir |
| Bağımlılık | Üretici, işi hangi kuyruğun yaptığını bilir | Yayıncı kimin dinlediğini bilmez |
| Örnekler | RabbitMQ kuyrukları, Amazon SQS, Sidekiq gibi iş kuyrukları | Kafka konuları, Redis Pub/Sub, Amazon SNS, Google Cloud Pub/Sub |
Fark, açıklamalı
İkisi de servislerin birbirini doğrudan çağırmak yerine bir aracı (broker) üzerinden asenkron konuşmasını sağlar: üretici bir mesaj gönderip yoluna devam eder, tüketiciler de fırsat bulduklarında onu işler. Mesaj kuyruğunda mesajlar sırada bekler ve her birini tek bir tüketici alıp işler. Yayınla/abone ol (publish/subscribe) modelinde ise yayıncı mesajı bir konuya (topic) gönderir ve o konunun her abonesi kendi kopyasını alır.
Fark, tek alıcıya karşı çok alıcıdır. Kuyruk işi paylaştırır: aynı kuyruğu okuyan on işçi, resim boyutlandırmak ya da e-posta göndermek gibi farklı işleri alır; işçi eklemek de işlem kapasitesini artırır. Pub/sub ise olguları yayar: bir sipariş verildiğinde faturalama, kargo ve analitik, sipariş servisi onların varlığından haberdar olmadan her biri kendi tepkisini verebilir.
Gerçek sistemler çoğu zaman ikisini birleştirir. RabbitMQ'da, SQS'i besleyen Amazon SNS'te ya da Google Cloud Pub/Sub'da bir konu, abone olan her servis için bir kuyruğa dağıtılabilir; o kuyruğu da servisin işçileri paylaşır. Kafka ikisini de konular ve tüketici grupları (consumer group) ile karşılar: her grup her mesajı görür, bir grubun içinde ise her mesaj tek bir üyeye gider.
Sık yapılan bir yanlış, pub/sub'ın mesajları herkes okuyana kadar her zaman sakladığı düşüncesidir. Klasik pub/sub'da çevrimdışı olan bir abone, sistem kalıcı abonelikler ya da her abonenin arkasına bir kuyruk eklemedikçe mesajları basitçe kaçırır; kuyrukta ise mesajlar bir tüketici işlediğini onaylayana kadar bekler.
Hangisini kullanmalısınız?
Mesaj Kuyruğu şu durumlarda doğru seçim:
- Her görev tam olarak bir kez yapılmalı; bir e-posta göndermek ya da bir kartı tahsil etmek gibi.
- Ağır işi bir işçi havuzuna yaymak istiyorsunuz.
- Mesajlar bir işçi boşalana kadar güvenle beklemeli.
Pub/Sub şu durumlarda doğru seçim:
- Birbirinden bağımsız birkaç servisin aynı olaya tepki vermesi gerekiyor.
- Üreticiyi değiştirmeden yeni tüketiciler eklemek istiyorsunuz.
- Fiyat güncellemeleri ya da bildirimler gibi değişiklikleri yayıyorsunuz.
Tek bir mesaj: tek bir işçiye ya da her servise
// queue stands for a broker client, such as RabbitMQ's
await queue.send("resize-image", { imageId: 7 });
// Three workers run this; each job is handled by only one of them
queue.consume("resize-image", async (job) => {
await resize(job.imageId);
job.ack(); // done: remove it from the queue
});// bus stands for a broker client, such as Google Cloud Pub/Sub's
await bus.publish("order.placed", { orderId: 1001 });
// Every subscriber gets its own copy of each event
bus.subscribe("order.placed", (e) => billing.charge(e.orderId));
bus.subscribe("order.placed", (e) => shipping.prepare(e.orderId));
bus.subscribe("order.placed", (e) => analytics.track(e));Sık sorulan sorular
Kafka bir mesaj kuyruğu mu, pub/sub mı?
Kafka, ikisi gibi de davranabilen bir olay akışı (event streaming) platformudur. Her tüketici grubu her mesajı okur, bu pub/sub'a benzer; bir grubun üyeleri ise mesajları kendi aralarında paylaşır, bu da kuyruğa benzer.
Bir mesaj kuyruğunun birden çok tüketicisi olabilir mi?
Evet, ama yarışırlar: her mesaj yine yalnızca birine gider. Kuyruk işi birçok işçiye böyle yayar.
Mikroservislere hangisi uyar?
İkisi de kullanılır. Kuyruklar bir kez çalışması gereken komutlara ve arka plan işlerine, pub/sub ise birkaç servisin ilgilendiği olaylara uyar. Birçok sistem, servis başına bir kuyruğu besleyen pub/sub konuları kullanır.