Что именно?
Служба Pub/Sub — это шаблон проектирования, который позволяет взаимодействовать между различными модулями веб-приложения независимо друг от друга. Это позволяет издателям отправлять сообщения подписчикам, ничего о них не зная. Издатели могут публиковать сообщения в теме, а подписчики могут подписываться на эту тему, чтобы получать сообщения из этих тем.
Этот тип дизайна в основном полезен для создания веб-приложений в реальном времени. Например, если мы создаем приложение для чата, мы можем использовать службу Pub/Sub для отправки сообщений от одного пользователя другому в режиме реального времени. Этого можно достичь, поскольку служба Pub/Sub позволяет обрабатывать события асинхронно.
Как это работает?
Служба Pub/Sub обычно состоит из трех основных компонентов:
- Издатель: издатель отвечает за отправку сообщений в темы. Это может быть любая часть приложения, которой необходимо отправлять сообщения.
- Тема: здесь публикуются сообщения. Подписчики могут подписаться на тему, чтобы получать сообщения.
- Подписчик. Подписчик отвечает за получение сообщений из темы. Это может быть любая часть приложения, которому необходимо получать сообщения.
const subscribers = {}; function publish(topic, message) { if (!Array.isArray(subscribers[topic])) { return; } subscribers[topic].forEach( (callback) => callback(message) ); } function subscribe(topic, callback) { if (!Array.isArray(subscribers[topic])) { subscribers[topic] = []; } const index = subscribers[topic].push(callback) - 1; return { unsubscribe() { subscribers[topic].splice(index, 1); } } } export { publish, subscribe }; // Example usage // Subscribing to a new topic const subscription = pubSub.subscribe("event", data => { console.log(`"event", was published with this data: ${data.msg}`); }) // unsubscribing subscription.unsubscribe(); // Publishing a message const message = { msg: "Publishing a new topic" }; pubSub.publish("event", message);
В этом примере мы реализовали базовый шаблон Pub/Sub с двумя методами: subscribe
и publish
. Метод subscribe
используется для подписки на тему и принимает имя темы и функцию обратного вызова в качестве аргументов.
Метод publish
используется для публикации сообщения в теме и принимает имя темы и объект сообщения в качестве аргументов.
Давайте сосредоточимся на методе подписки.
function subscribe(topic, callback) { if (!Array.isArray(subscribers[topic])) { subscribers[topic] = []; } const index = subscribers[topic].push(callback) - 1; return { unsubscribe() { subscribers[topic].splice(index, 1); } } }
Метод подписки сначала проверяет, была ли тема уже зарегистрирована в объекте subscribers
. Если тема не существует в объекте subscribers
, он регистрирует тему, используя имя темы (первый аргумент) в качестве ключа, и инициализирует значение пустым массивом. Наконец, мы поместим обратный вызов подписчика в массив событий. Эта функция также возвращает функцию unsubscribe
, с помощью которой подписчики могут удалить подписку на тему, когда она больше не нужна.
Служба публикации
function publish(topic, message) { if (!Array.isArray(subscribers[topic])) { return; } subscribers[topic].forEach( (callback) => callback(message) ); }
Он проверяет, есть ли подписчики, которые зарегистрировались в теме. Если на эту тему нет подписчиков, она просто возвращается из функции. Если есть подписчики, он перебирает массив тем и выполняет обратный вызов каждого подписчика, который был помещен в массив тем с опубликованным публикатором сообщений.
Почему мы должны его использовать?
Слабая связь. Одним из самых больших преимуществ использования системы публикации/подписки является слабая связь. Как мы уже говорили, издатели не знают о подписчиках.
Масштабируемость: позволяет масштабировать систему до огромных объемов. Это связано с тем, что шаблон может обрабатывать доставку сообщений асинхронно, что означает, что он не блокирует другие части приложения.
Счастливого PubSub!!!!