Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Брокер сообщений Redis: как работает и как использовать

Анастасия Островская
Анастасия Островская
Технический писатель
30 марта 2023 г.
2670
8 минут чтения
Средний рейтинг статьи: 5

Изначально Redis был разработан как база данных и кэш для временного хранения данных в оперативной памяти. Но в версию Redis 2.0. создатели включили функцию PUBLISH/SUBSCRIBE, которая позволила использовать Redis в качестве брокера сообщений. 

Сегодня Redis широко применяется для поддержки чатов и сервисов обмена сообщениями, а также для отправки сообщений по модели pub / sub. В этой статье мы рассмотрим, как работает брокер сообщений и как его можно использовать. 

Зачем нужен брокер сообщений

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

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

Основные компоненты брокера сообщений:

  • Producer отвечает за отправку сообщений в брокер, который затем доставляет их подписчикам.
  • Consumer получает и обрабатывает сообщения из брокера сообщений.
  • Queue представляет собой модель отправки и получения сообщений, где отправители помещают сообщения в очередь, а получатели извлекают их из очереди. Каждое сообщение обрабатывается только одним получателем.
  • Topic — это модель отправки и получения сообщений, где producer отправляет сообщения на конкретную тему, а получатели, подписанные на эту тему, получают эти сообщения.

Модели обмена сообщениями при помощи брокера сообщений

Реализовать обмен сообщениями можно несколькими способами. Мы рассмотрим три основных. 

Обмен сообщениями «Point-to-Point»

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

Image1

Источник

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

Опубликовать/подписаться

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

Image2

Источник

Самые простые примеры, где реализуется данная модель: телеграм-каналы и онлайн-чаты. Кроме того, Redis можно использовать для передачи информации о событиях между разными инстансами приложений. Этот механизм может помочь отслеживать изменения в базе данных и активность пользователей.

Гибридная модель обмена сообщениями

Данная модель объединяет вместе P2P и Pub/Sub. Сообщения могут быть отправлены как в определенную очередь, так и в канал с определенной тематикой, чтобы их получили все подписчики одновременно.

Как использовать брокер сообщений Redis 

Для того, чтобы использовать Redis как брокер сообщений, его необходимо скачать и установить на сервер. После того, как Redis установлен, его необходимо запустить по инструкции redis-server, затем проверить корректность установки при помощи инструкции redis-cli.

И в завершении необходимо проверить конфигурационный файл, чтобы убедиться, что модуль Redis Pub/Sub включен. Если по какой-то причине он не работает, то в этот же конфигурационный файл добавьте строку следующего содержания:

loadmodule /usr/lib/redis/modules/redisearch.so

Создание очереди при помощи списка

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

Очереди сообщений создаются следующим образом:

RPUSH <queue_name> <message>
RPUSH <queue_name> <message2>

Так мы создали очередь с именем «queue_name» и добавили в нее два сообщения «message» и «message2».

Команда RPUSH добавляет новые элементы в конец списка. Если нужно добавить элементы в начало списка, достаточно заменить команду RPUSH на LPUSH.

Ряд команд, которые используются для управления очередями:

  • LPOP <queue_name> получение и удаление элемента из начала списка;
  • RPOP<queue_name> получение и удаление элемента из конца списка;
  • BLPOP <queue_name> <timeout> блокирующее получение и удаление элемента из начала  списка, где timeout указывается в секундах в качестве последнего аргумента;
  • BRPOP <queue_name> <timeout> блокирующее получение и удаление элемента из конца списка;
  • BRPOPLPUSH <source_queue_namet> <destination_queue_namet> <timeout> блокирующее получение и перемещение элемента из конца одного списка в начало другого списка;
  • LLEN <queue_name> получение количества элементов в списке;
  • LRANGE <queue_name> <start> <stop> получение списка сообщений, которые были отправлены на канал, где вместо start указывается начальный индекс элемента, а вместо stop — конечный индекс элемента, на котором заканчивается извлечение;
  • LINDEX <queue_name> <indext> получение элемента списка по индексу.

Команды LPUSH/RPUSH, LPOP/RPOP, BLPOP/BRPOP, BRPOPLPUSH используются для создания простых очередей сообщений, а команды LLEN и LINDEX применяют для мониторинга состояния очередей сообщений.

Надежные очереди в Redis

Надежные очереди гарантируют доставку сообщений в нужном порядке. Для их реализации используется команда BLMOVE. Она позволяет переносить элементы между списками, сохраняя при этом порядок элементов и обеспечивая блокировку в случае, когда список пустой. Если список source не обрабатывает сообщения до конца, команда blmove позволяет перенести сообщение в запасной список destination для дальнейшей обработки.

Рассмотрим синтаксис команды:

BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout

где:

  • source название списка (источника), из которого извлекается элемент;
  • destination название списка (источника), в который необходимо переместить этот элемент;
  • LEFT|RIGHT в первом случае обозначает направление извлечения элемента и помещение его в destination;
  • LEFT|RIGHT второе по порядку обозначает направление блокировки в случае пустого списка;
  • timeout время блокировки в секундах, если бесконечная блокировка, то значение равно 0.

Реализация механизма pub/sub

В Redis Pub/Sub сообщения, которые отправляются через каналы, называются push-сообщениями. Для того, чтобы оформить подписку на канал, необходимо использовать инструкцию SUBSCRIBE с указанием канала:

SUBSCRIBE timeweb_channel

Чтобы опубликовать push-сообщение в канал, в достаточно использовать команду PUBLISH:

PUBLISH timeweb_channel "Приветствуем в нашем канале"

Таким же образом можно отписаться от канала, используя команды UNSUBSCRIBE или PUNSUBSCRIBE.

Создание потоковой очереди типа Stream

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

Создать поток сообщений можно, используя следующую команду:

XADD name_stream * message1 _message2 _ message3

где команда XADD создает новое сообщение в потоке и добавляет его в конец потока.

Для чтения потока:

XREAD COUNT 3 STREAMS name_stream 1

где:

  • команда XREAD используется для чтения сообщений из одного или нескольких потоков;
  • COUNT 3 обозначает количество сообщений, которые необходимо прочитать из потока, а 1 указывает на то, с какого сообщения необходимо начать чтение. 

Также для управления потоковыми очередями в Redis и обработки сообщений в этих очередях будут полезны следующие команды:

  • XGROUP создание новой группы потоков или обновление существующей;
  • XREADGROUP чтение сообщения из указанной группы потоков;
  • XDEL удаление сообщения из потока;
  • XPENDING получение информации о необработанных сообщениях в группе потоков в Redis.

Но нужно учитывать, что команды типа Stream можно использовать только в случае, если версия Redis начинается от 5.0 и выше.

Преимущества брокера сообщений Redis

  • Поддержка различных структур данных: списки, строки с размером текста до 512 МБ, хэши для хранения списка полей и значений, растровые изображения, алгоритм HyperLogLogs и многое другое.
  • Высокая производительность позволяет приложениям проводить миллионы операций в секунду, поскольку, в отличие от других СУБД, Redis хранит данные в основной памяти сервера.
  • Сохранение данных даже в случае отказа сервера благодаря резервному копированию на определенный момент времени и механизму сохранения RDB, AOF в энергонезависимой памяти.
  • Универсальность и простота использования, так как Redis поддерживает множество языков программирования, в том числе C, Java, Python и Ruby, и поставляется со своими структурами данных.

Использование брокера сообщений Redis имеет ряд преимуществ. Например, относительно низкая задержка доставки сообщений, поддержка множества протоколов и форматов данных. Однако, Redis нельзя назвать универсальным брокером сообщений, поскольку он не гарантирует 100% доставку сообщений в случае сбоя или отказа узла. В качестве альтернативных вариантов можно рассмотреть брокеры сообщений RabbitMQ, Apache Kafka и ActiveMQ.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону