Yayımla/abone ol (publish/subscribe) deseni: birçok alıcıya iletiler
Kısaca: Bir gönderici, alıcıları bilmeden bir konuda ileti yayımlar; konuya abone olan herkes onları alır.
Biraz daha ayrıntılı: Publish/subscribe’da (pub/sub) gönderici (publisher) ile alıcı (subscriber) birbirinden ayrıştırılmıştır. Arada bir aracı, yani broker durur. Yayımcı kimin dinlediğini bilmez, aboneler kimin gönderdiğini bilmez. Bu, sistemlerin kolay genişletilmesini sağlar: yeni bir alıcı mevcut bir konuya basitçe abone olur.
Ayrıntılı
Yapı taşları
- Konu (topic) (başlık, kanal): iletilerin yayımlandığı ad, örn.
order.new. - Yayımcı (publisher): bir konuya ileti gönderir.
- Abone (subscriber): konulara abone olur ve gelen iletileri işler.
- Broker: iletileri kabul eder, dağıtır ve arabelleğe alabilir. Örnekler: MQTT broker’ları, Redis pub/sub, Google Pub/Sub, Apache Kafka.
Kuyruktan farkı
Klasik bir kuyrukta her ileti birkaç rakip tüketiciden tam olarak birine gider. Pub/sub’da her abone bir kopya alır. Birçok sistem ikisini birleştirir: birkaç hizmet bir konuya abone olur ve bir hizmetin içinde birkaç örnek işi paylaşır (tüketici grupları).
Redis ile JavaScript örneği
// alıcı
subscriber.subscribe('order.new', (msg) => console.log('Yeni:', msg));
// gönderici
publisher.publish('order.new', JSON.stringify({ id: 42 }));Faturalama hizmeti ve gönderim hizmeti aynı konuya abone olabilir ve birbirinden bağımsız tepki verebilir.
Dikkat edilecekler
Düz Redis pub/sub hiçbir şey saklamaz: o anda bağlı olmayan iletiyi kaçırır. Güvenilir teslimat için depolamalı ve onaylı broker’lara ihtiyacınız var. Aynı ileti birden fazla kez gelebileceğinden alıcılar idempotent çalışmalıdır. Sisteme bağlı olarak sıralama yalnızca bölüm (partition) başına garanti edilir veya hiç edilmez.
Ayrıca bak: İleti kuyruğu, Apache Kafka, Gözlemci deseni, Webhook’lar