EMZETT.
Увійти

Патерн публікації/підписки (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, Патерн «Спостерігач», Вебхуки