Патерн публікації/підписки (publish/subscribe): повідомлення багатьом отримувачам
Коротко: Відправник публікує повідомлення в темі, не знаючи отримувачів; усі, хто підписався на тему, їх отримують.
Докладніше: У publish/subscribe (pub/sub) відправник (publisher) і отримувач (subscriber) розділені. Між ними перебуває посередник — брокер. Видавець не знає, хто слухає, підписники не знають, хто надсилає. Це спрощує розширення систем: новий отримувач просто підписується на наявну тему.
Подробиці
Будівельні блоки
- Тема (topic) (предмет, канал): ім’я, під яким публікуються повідомлення, наприклад
order.new. - Видавець (publisher): надсилає повідомлення в тему.
- Підписник (subscriber): підписується на теми й обробляє вхідні повідомлення.
- Брокер: приймає повідомлення, розподіляє їх і може буферизувати. Приклади: брокери MQTT, Redis pub/sub, Google Pub/Sub, Apache Kafka.
Відмінність від черги
У класичній черзі кожне повідомлення дістається рівно одному з кількох конкуруючих споживачів. У pub/sub кожен підписник отримує копію. Багато систем поєднують обидва підходи: кілька сервісів підписуються на тему, а всередині одного сервісу кілька екземплярів ділять роботу (групи споживачів).
Приклад на JavaScript із Redis
// отримувач
subscriber.subscribe('order.new', (msg) => console.log('Нове:', msg));
// відправник
publisher.publish('order.new', JSON.stringify({ id: 42 }));Сервіс виставлення рахунків і сервіс доставки можуть підписатися на ту саму тему й реагувати незалежно один від одного.
На що звернути увагу
Простий Redis pub/sub нічого не зберігає: хто в цей момент не підключений, пропускає повідомлення. Для надійної доставки потрібні брокери зі сховищем і підтвердженнями. Оскільки те саме повідомлення може прийти більше одного разу, отримувачі мають працювати ідемпотентно. Залежно від системи порядок гарантується лише в межах розділу (partition) або взагалі не гарантується.
Див. також: Черга повідомлень, Apache Kafka, Патерн «Спостерігач», Вебхуки