Что именно?

Служба Pub/Sub — это шаблон проектирования, который позволяет взаимодействовать между различными модулями веб-приложения независимо друг от друга. Это позволяет издателям отправлять сообщения подписчикам, ничего о них не зная. Издатели могут публиковать сообщения в теме, а подписчики могут подписываться на эту тему, чтобы получать сообщения из этих тем.

Этот тип дизайна в основном полезен для создания веб-приложений в реальном времени. Например, если мы создаем приложение для чата, мы можем использовать службу Pub/Sub для отправки сообщений от одного пользователя другому в режиме реального времени. Этого можно достичь, поскольку служба Pub/Sub позволяет обрабатывать события асинхронно.

Как это работает?

Служба Pub/Sub обычно состоит из трех основных компонентов:

  1. Издатель: издатель отвечает за отправку сообщений в темы. Это может быть любая часть приложения, которой необходимо отправлять сообщения.
  2. Тема: здесь публикуются сообщения. Подписчики могут подписаться на тему, чтобы получать сообщения.
  3. Подписчик. Подписчик отвечает за получение сообщений из темы. Это может быть любая часть приложения, которому необходимо получать сообщения.
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!!!!