Использование Redis pub/sub в Node.js

Автор Виктор Иона✏️

При создании приложений в наши дни разработчики часто сталкиваются с необходимостью разделения систем и разделения их на компоненты. Однако, когда приложения построены на различных компонентах, каждый компонент не может взаимодействовать с другими компонентами или понимать, как они функционируют.

Единственная связь между ними, которая может обеспечить такое взаимодействие и информацию, — это использование паттерна публикации/подписки (pub/sub).

В этой статье мы рассмотрим паттерн publish/subscribe, как установить его в приложении Node.js, как реализовать паттерн и поймем альтернативы использованию Redis. Здесь рассматриваются:

  • Понимание паттерна pub/sub
  • Использование Redis
  • Использование Redis для pub/sub
  • Настройка Redis для pub/sub
  • Реализация публикации в Node.js с помощью Redis
  • Реализация subscribe в Node.js с помощью Redis
  • Альтернативы использованию Redis

Прежде чем приступить к работе, важно полностью понять паттерн, прежде чем переходить к тонкостям его использования в Node.js. Кроме того, убедитесь, что у вас установлено следующее:

  • Node.js
  • Redis
  • Клиент Redis для Node.js

Понимание паттерна pub/sub

Pub/sub — это схема обмена сообщениями, в которой различные компоненты публикуют и подписываются друг на друга, чтобы уведомлять и отправлять друг другу данные.

Он также позволяет разделить компоненты, и каждый компонент полагается на брокера сообщений. По сути, издатель публикует сообщение, а подписчик подписывается на издателя, чтобы получить сообщение от брокера сообщений.

Использование этого паттерна обеспечивает простоту разработки, поэтому разработчики могут работать и беспокоиться о своем компоненте или сервисе без необходимости понимать интерфейс других компонентов.

Этот паттерн также обеспечивает масштабируемость, так как компоненты слабо связаны друг с другом и легко становятся надежными и безопасными.

Использование Redis

Redis — это система in-memory, которая может хранить все типы данных в определенном формате, и ее основное назначение — кэширование данных, и ее часто выбирают вместо альтернатив, особенно memcached, из-за ее способности хранить любые типы данных надежным образом.

Также важно отметить, что Redis использует структуру данных для хранения данных, и в нем нет языка запросов или гибкости для выполнения некоторых специальных запросов.

Использование Redis для pub/sub

Я склоняюсь к Redis в качестве выбора при использовании pub/sub из-за его простоты; здесь не требуется сложная наука, но только если приложение простое и без сложностей.

Кроме того, обратите внимание, что Redis — это система in-memory, и данные могут обрабатываться только до тех пор, пока хватит выделенной для них оперативной памяти. Это означает, что Redis хорошо подходит для обмена сообщениями в реальном времени и систем, которые отправляют данные быстро и без задержек.

Другие случаи использования кэширования включают следующие.

Настройка Redis для pub/sub

Прежде чем начать, мы узнаем, что Redis реализует модель обмена сообщениями pub/sub, что означает, что издатель отправляет сообщение подписчику, а подписчик получает его. Обратите внимание, что на одного издателя может подписаться более одного компонента.

Давайте посмотрим, как это работает в Redis-CLI:

Vectormikes-MacBook-Pro:Projects macbookpro$ redis-cli
127.0.0.1:6379> SUBSCRIBE article
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "article"
3) (integer) 1
Войти в полноэкранный режим Выйти из полноэкранного режима

В терминале выше показан подписчик, подписавшийся на канал под названием article.

Давайте теперь откроем новое окно терминала:

Vectormikes-MacBook-Pro:Projects macbookpro$ redis-cli
127.0.0.1:6379> PUBLISH article Pub/Sub
(integer) 1
127.0.0.1:6379> 
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем мы можем опубликовать сообщение Pub/Sub в тот же канал, article:

Vectormikes-MacBook-Pro:Projects macbookpro$ redis-cli
127.0.0.1:6379> SUBSCRIBE article
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "article"
3) (integer) 1
1) "message"
2) "article"
3) "Pub/Sub"
Войти в полноэкранный режим Выйти из полноэкранного режима

Все подписчики одного и того же канала получают на свой конец одно и то же сообщение.

Обратите внимание, что перед началом работы на вашем компьютере должен быть установлен сервер Redis.

Далее создайте папку, содержащую рабочий каталог, и назовите ее redisNode:

$ mkdir redisNode && cd redisNode
Вход в полноэкранный режим Выход из полноэкранного режима

В идеале мы хотим создать два разных файла, которые будут выступать в роли издателя и подписчика. Но давайте сначала создадим две папки, которые будут отдельными компонентами со своими собственными серверами:

$ mkdir publish subscribe
Вход в полноэкранный режим Выход из полноэкранного режима

Далее инициализируем проект для компонента publish:

$ cd publish && npm init -y
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем инициализируйте проект для компонента публикации:

$ cd subscribe && npm init -y
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь у нас есть два отдельных компонента со своими серверами, использующие один в качестве издателя, а другой — в качестве подписчика.

Реализация публикации в Node.js с помощью Redis

Здесь мы сосредоточимся на реализации компонента, который будет заниматься публикацией сообщений в определенный канал.

Чтобы использовать Redis в Node.js, нам нужно установить пакет redis. Он служит клиентом для экземпляра Redis на нашей машине:

$ npm install redis
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь мы можем создать файл server.js в каталоге publish, который будет содержать наш код:

const redis = require('redis');
const publisher = redis.createClient();

(async () => {

  const article = {
    id: '123456',
    name: 'Using Redis Pub/Sub with Node.js',
    blog: 'Logrocket Blog',
  };

  await publisher.connect();

  await publisher.publish('article', JSON.stringify(article));
})();
Войти в полноэкранный режим Выйти из полноэкранного режима

В приведенном выше коде мы импортируем Redis и вызываем метод createClient(). Теперь мы хотим опубликовать объект article, содержащий id, name и blog.

С помощью этого объекта мы можем отправить его как сообщение в канал article:

$ publisher.publish('article', JSON.stringify(article));
Войти в полноэкранный режим Выйти из полноэкранного режима

Реализация subscribe в Node.js с помощью Redis

Поскольку у нас есть компонент, готовый публиковать сообщения, давайте реализуем компонент subscribe, который будет получать эти сообщения. В идеале мы можем создать или иметь несколько компонентов.

Во-первых, убедитесь, что Redis установлен:

$ npm install express redis
Войдите в полноэкранный режим Выйти из полноэкранного режима

Затем создайте файл server.js в каталоге subscribe, который будет содержать реализацию:

const redis = require('redis');

(async () => {

  const client = redis.createClient();

  const subscriber = client.duplicate();

  await subscriber.connect();

  await subscriber.subscribe('article', (message) => {
    console.log(message); // 'message'
  });

})();
Вход в полноэкранный режим Выйти из полноэкранного режима

Чтобы подписаться, откройте терминал и запустите файл subscribe, server.js, и ожидайте сообщения после публикации сообщения:

Vectormikes-MacBook-Pro:subscribe macbookpro$ node server.js
{"id":"123456","name":"Using Redis Pub/Sub with Node.js","blog":"Logrocket Blog"}
Войти в полноэкранный режим Выход из полноэкранного режима

Чтобы опубликовать, откройте другой терминал и запустите файл publish.

Напротив, если вы хотите реализовать pub/sub на том же сервере, а не на другом, важно отметить, что вы не можете сделать это на одном клиенте Redis, потому что один клиент Redis не может обрабатывать pub/sub; их должно быть два.

Поэтому вместо этого вы должны добавить два клиента Redis для выполнения функций subscribe и publish:

const subscriber = redis.createClient({ ... })
const publisher = redis.createClient({ ... })
Вход в полноэкранный режим Выход из полноэкранного режима

Также не забудьте подключить клиента Redis в асинхронной функции:

await client.connect()
Войти в полноэкранный режим Выход из полноэкранного режима

Альтернативы использованию Redis

Помимо использования Redis, у нас есть альтернативы Redis, реализующие паттерн pub/sub, особенно в приложениях Node.js. Ниже приведен список распространенных альтернатив Redis.

Apache Kafka

Apache Kafka намного быстрее Redis и был создан для обработки большего количества данных, чем Redis. Kafka также имеет тенденцию к длительному периоду хранения данных.

RabbitMQ

RabbitMQ — это специализированный брокер сообщений, более продвинутый, чем Redis, поскольку он был разработан как брокер сообщений для шаблонов pub/sub, предлагая больше конфигураций и сценариев. Redis — это просто хранилище памяти, которое является идеальной базой данных.

Google Cloud Pub/Sub

Google Cloud Pub/Sub является более масштабируемой, если не высокомасштабируемой, по сравнению с Redis. Но она менее конфигурируема, чем Redis.

Firebase Cloud Messaging

Когда дело доходит до Firebase Cloud Messaging, выбор за вами, но Firebase предлагает модель документа, а не in-memory в Redis.

Заключение

В этом кратком руководстве мы рассмотрели, как можно быстро настроить приложение Node.js для инициирования шаблона pub/sub с использованием Redis. Этот подход ориентирован на микросервис или слабосвязанную архитектуру.


Всего 200 ✔️ Мониторинг неудачных и медленных сетевых запросов в производстве

Развертывание веб-приложения или веб-сайта на базе Node — это самое простое. Убедиться, что ваш экземпляр Node продолжает обслуживать ресурсы вашего приложения — вот где все становится сложнее. Если вы заинтересованы в том, чтобы убедиться в успешности запросов к бэкенду или сторонним сервисам, попробуйте LogRocket.

https://logrocket.com/signup/

LogRocket — это как видеорегистратор для веб- и мобильных приложений, записывающий буквально все, что происходит, пока пользователь взаимодействует с вашим приложением. Вместо того, чтобы гадать, почему возникают проблемы, вы можете собрать и сообщить о проблемных сетевых запросах, чтобы быстро понять первопричину.

LogRocket использует инструменты вашего приложения для записи базовых показателей производительности, таких как время загрузки страницы, время до первого байта, медленные сетевые запросы, а также регистрирует действия/состояние Redux, NgRx и Vuex. Начните мониторинг бесплатно.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *