Pub/Sub
Yayın-Abonelik (Publish-Subscribe)
- Okunuşu
- pab sab
Kısaca
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 nedir?
Yayın-abonelik kalıbında yayıncı (publisher) adı verilen göndericiler mesajları belirli alıcılara göndermez. Bunun yerine her mesajı order.placed gibi bir konuya (topic; kanal da denir) yayımlar ve bir mesaj aracısı, o konuyla ilgilendiğini kaydeden her aboneye bir kopya teslim eder. Yayıncılar abonelerin kim olduğunu ya da kaç tane olduğunu bilmez, aboneler de kimin yayımladığını bilmez.
Bir çevrimiçi mağaza order.placed yayımladığında, e-posta servisi bir makbuz gönderir, envanter servisi stok ayırır ve analitik servisi satışı kaydeder; her biri bağımsız bir abonedir. Sadakat puanı servisi gibi yeni bir özellik eklemek, yayıncıyı hiç değiştirmeden bir abone daha eklemek demektir. Pub/sub; Redis, RabbitMQ, NATS, IoT cihazları için MQTT aracıları, Apache Kafka ve bulut sağlayıcılarının yönetilen mesajlaşma servisleri gibi aracılar ve platformlar tarafından sunulur.
Pub/sub bir dergi aboneliği gibi çalışır: yayıncı bir sayı çıkarır, abone olan herkes kendi kopyasını alır ve abone olmayanlar hiçbir şey almaz. Teslimat garantileri sistemler arasında çok değişir. Bazıları ateşle-ve-unut şeklindedir; çevrimdışı bir abone mesajı kaçırır. Diğerleri ise mesajları kalıcı olarak saklar, böylece aboneler döndüklerinde yetişebilir.
Pub/sub sıklıkla mesaj kuyruğu ve observer kalıbıyla karıştırılır. Mesaj kuyruğunda her mesaj tam olarak bir tüketici tarafından işlenir; bu, işi worker'lar arasında paylaştırmak için idealdir. Pub/sub ise her mesajı her aboneye teslim eder; birçok sistem ikisini birleştirir ve bir konu, abone olan servis başına bir kuyruğa dağılır. Observer kalıbı aynı fikrin süreç içi sürümüdür; nesneler tek bir program içinde başka bir nesnenin olaylarına abone olur. Pub/sub ise ortaya bir aracı koyar ve genellikle ağı aşar.
Bir bakışta
Önemli noktalar
- Yayıncılar konulara mesaj gönderir ve bir konunun her abonesi bir kopya alır.
- Yayıncılar ve aboneler birbirini bilmez; bu da servisleri gevşek bağlı tutar.
- Yayıncıyı değiştirmeden yeni aboneler eklenebilir.
- Teslimat garantileri değişir: bazı sistemler çevrimdışı aboneler için mesajları bırakır, bazıları saklar.
- Kuyruk her mesajı bir tüketiciye gönderir; pub/sub ise tüm abonelere.
Örnek
// Pub/sub with Redis, using the node-redis client
import { createClient } from "redis";
const publisher = createClient();
const subscriber = publisher.duplicate();
await Promise.all([publisher.connect(), subscriber.connect()]);
// Every service that subscribes to the channel gets its own copy
await subscriber.subscribe("order.placed", (message) => {
const order = JSON.parse(message);
console.log("Send receipt for order", order.id);
});
// The publisher doesn't know or care who is listening
await publisher.publish("order.placed", JSON.stringify({ id: 1001, total: 59.9 }));Sık sorulan sorular
Pub/sub ile mesaj kuyruğu arasındaki fark nedir?
Mesaj kuyruğunda her mesaj bir tüketiciye gider; bu yüzden birkaç worker yükü paylaşabilir. Pub/sub'da ise her abone her mesajın kendi kopyasını alır; bu yüzden birkaç farklı servis aynı olaya tepki verebilir.
Kafka pub/sub midir?
Kafka pub/sub'ı destekler, çünkü birçok tüketici grubu aynı konuyu bağımsız olarak okuyabilir. Tek bir tüketici grubu içinde her bölüm (partition) yalnızca bir tüketici tarafından okunur; bu yüzden Kafka işi paylaştırmak için kuyruk gibi de davranabilir.
Bir abone çevrimdışıyken mesajlara ne olur?
Sisteme bağlıdır. Ateşle-ve-unut sistemler mesajı o abone için bırakır; kalıcı sistemler ise abone onaylayana ya da saklama süresi dolana kadar mesajı tutar.
Sık karşılaştırılanlar
İlgili sayfalar
- Mesaj KuyruğuBackend ve API'ler, s. 28Mesaj 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.
- Olay Güdümlü MimariYazılım Mimarisi, s. 29Olay güdümlü mimari, servislerin bir siparişin verilmesi gibi olaylar üreterek ve bunlara tepki vererek iletişim kurduğu bir yazılım tasarım tarzıdır.
- Observer DeseniYazılım Mimarisi, s. 28Observer deseni, subject adlı bir nesnenin durumu değiştiğinde abone listesini otomatik olarak bilgilendirdiği davranışsal bir tasarım desenidir.
- Event StreamingBackend ve API'ler, s. 13Event streaming, olayları birçok uygulamanın gerçek zamanlı okuyup yeniden oynatabildiği ve işleyebildiği sürekli, sıralı, kalıcı bir log olarak kaydetmektir.
- MikroservislerYazılım Mimarisi, s. 24Mikroservisler, bir uygulamanın ağ üzerinden iletişim kuran, küçük ve bağımsız olarak dağıtılabilen servislere bölündüğü bir mimari tarzdır.
- Gevşek BağlılıkYazılım Mimarisi, s. 16Gevşek bağlılık, bileşenlerin birbirine olabildiğince az bağımlı olduğu, böylece birinin diğerlerini bozmadan değişebildiği bir tasarım ilkesidir.
- KafkaBackend ve API'ler, s. 25Apache Kafka, olayları kalıcı, sıralı log'larda tutan dağıtık olay akışı platformudur; servisler onları yayımlar, gerçek zamanlı okur ya da yeniden oynatır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin