Изначально Redis был разработан как база данных и кэш для временного хранения данных в оперативной памяти. Но в версию Redis 2.0. создатели включили функцию PUBLISH/SUBSCRIBE
, которая позволила использовать Redis в качестве брокера сообщений.
Сегодня Redis широко применяется для поддержки чатов и сервисов обмена сообщениями, а также для отправки сообщений по модели pub / sub
. В этой статье мы рассмотрим, как работает брокер сообщений и как его можно использовать.
В первую очередь брокер сообщений упрощает обмен информацией между системами и приложениями, даже если они работают на разных языках и платформах. При небольшом количестве участников обмениваться данными можно напрямую, однако с увеличением количества участников возникает потребность в большей интерактивности, и этот способ становится неэффективным. В таких случаях лучше использовать брокер сообщений, который управляет процессом обмена информацией и является посредником между отправителем и получателем.
Особенно он будет полезен для асинхронного взаимодействия микросервисов. Асинхронная связь не требует ожидания ответа в режиме реального времени. В качестве примера можно привести электронную почту, где пользователи могут отправить письмо и продолжить выполнять другие задачи.
Реализовать обмен сообщениями можно несколькими способами. Мы рассмотрим три основных.
В рамках модели P2P каждое сообщение отправляется в определенную очередь и может быть обработано только одним получателем. При этом брокер сообщений гарантирует, что недоставленные сообщения будут сохранены в очереди до тех пор, пока они не будут обработаны получателем.
Преимущество модели P2P заключается в том, что каждая транзакция обрабатывается всего один раз. Один из примеров использования P2P для обмена сообщениями — это обработка транзакций, где надежность и безопасность являются ключевыми факторами.
При использовании шаблона pub/sub
сообщения распространяются между всеми пользователями, подписанными на общую тему. Это полезно для реализации механизмов уведомлений или распределения независимых задач. Причем Redis поддерживает различные типы сообщений, включая строки, хэши, списки и множества, что позволяет использовать его для передачи различных типов данных.
Самые простые примеры, где реализуется данная модель: телеграм-каналы и онлайн-чаты. Кроме того, Redis можно использовать для передачи информации о событиях между разными инстансами приложений. Этот механизм может помочь отслеживать изменения в базе данных и активность пользователей.
Данная модель объединяет вместе P2P и Pub/Sub. Сообщения могут быть отправлены как в определенную очередь, так и в канал с определенной тематикой, чтобы их получили все подписчики одновременно.
Для того, чтобы использовать 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
применяют для мониторинга состояния очередей сообщений.
Надежные очереди гарантируют доставку сообщений в нужном порядке. Для их реализации используется команда BLMOVE. Она позволяет переносить элементы между списками, сохраняя при этом порядок элементов и обеспечивая блокировку в случае, когда список пустой. Если список source не обрабатывает сообщения до конца, команда blmove позволяет перенести сообщение в запасной список destination для дальнейшей обработки.
Рассмотрим синтаксис команды:
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout
где:
source
— название списка (источника), из которого извлекается элемент;destination
— название списка (источника), в который необходимо переместить этот элемент;LEFT|RIGHT
в первом случае обозначает направление извлечения элемента и помещение его в destination
;LEFT|RIGHT
второе по порядку обозначает направление блокировки в случае пустого списка;timeout
— время блокировки в секундах, если бесконечная блокировка, то значение равно 0.В Redis Pub/Sub сообщения, которые отправляются через каналы, называются push-сообщениями. Для того, чтобы оформить подписку на канал, необходимо использовать инструкцию SUBSCRIBE
с указанием канала:
SUBSCRIBE timeweb_channel
Чтобы опубликовать push-сообщение в канал, в достаточно использовать команду PUBLISH
:
PUBLISH timeweb_channel "Приветствуем в нашем канале"
Таким же образом можно отписаться от канала, используя команды UNSUBSCRIBE
или PUNSUBSCRIBE
.
Потоковая очередь предоставляет более расширенные возможности. К ним можно отнести группировку, обратный вызов и потребление сообщений с помощью итератора.
Создать поток сообщений можно, используя следующую команду:
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 имеет ряд преимуществ. Например, относительно низкая задержка доставки сообщений, поддержка множества протоколов и форматов данных. Однако, Redis нельзя назвать универсальным брокером сообщений, поскольку он не гарантирует 100% доставку сообщений в случае сбоя или отказа узла. В качестве альтернативных вариантов можно рассмотреть брокеры сообщений RabbitMQ, Apache Kafka и ActiveMQ.