Изначально Redis был разработан как база данных и кэш для временного хранения данных в оперативной памяти. Но в версию Redis 2.0. создатели включили функцию PUBLISH/SUBSCRIBE, которая позволила использовать Redis в качестве брокера сообщений.
Сегодня Redis широко применяется для поддержки чатов и сервисов обмена сообщениями, а также для отправки сообщений по модели pub / sub. В этой статье мы рассмотрим, как работает брокер сообщений и как его можно использовать.
cloud
Зачем нужен брокер сообщений
В первую очередь брокер сообщений упрощает обмен информацией между системами и приложениями, даже если они работают на разных языках и платформах. При небольшом количестве участников обмениваться данными можно напрямую, однако с увеличением количества участников возникает потребность в большей интерактивности, и этот способ становится неэффективным. В таких случаях лучше использовать брокер сообщений, который управляет процессом обмена информацией и является посредником между отправителем и получателем.
Особенно он будет полезен для асинхронного взаимодействия микросервисов. Асинхронная связь не требует ожидания ответа в режиме реального времени. В качестве примера можно привести электронную почту, где пользователи могут отправить письмо и продолжить выполнять другие задачи.
Основные компоненты брокера сообщений:
- Producer отвечает за отправку сообщений в брокер, который затем доставляет их подписчикам.
- Consumer получает и обрабатывает сообщения из брокера сообщений.
- Queue представляет собой модель отправки и получения сообщений, где отправители помещают сообщения в очередь, а получатели извлекают их из очереди. Каждое сообщение обрабатывается только одним получателем.
- Topic — это модель отправки и получения сообщений, где producer отправляет сообщения на конкретную тему, а получатели, подписанные на эту тему, получают эти сообщения.
Модели обмена сообщениями при помощи брокера сообщений
Реализовать обмен сообщениями можно несколькими способами. Мы рассмотрим три основных.
Обмен сообщениями «Point-to-Point»
В рамках модели P2P каждое сообщение отправляется в определенную очередь и может быть обработано только одним получателем. При этом брокер сообщений гарантирует, что недоставленные сообщения будут сохранены в очереди до тех пор, пока они не будут обработаны получателем.
Преимущество модели P2P заключается в том, что каждая транзакция обрабатывается всего один раз. Один из примеров использования P2P для обмена сообщениями — это обработка транзакций, где надежность и безопасность являются ключевыми факторами.
Опубликовать/подписаться
При использовании шаблона pub/sub сообщения распространяются между всеми пользователями, подписанными на общую тему. Это полезно для реализации механизмов уведомлений или распределения независимых задач. Причем Redis поддерживает различные типы сообщений, включая строки, хэши, списки и множества, что позволяет использовать его для передачи различных типов данных.
Самые простые примеры, где реализуется данная модель: телеграм-каналы и онлайн-чаты. Кроме того, 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.
