Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Зачем нужен брокер сообщений
В первую очередь брокер сообщений упрощает обмен информацией между системами и приложениями, даже если они работают на разных языках и платформах. При небольшом количестве участников обмениваться данными можно напрямую, однако с увеличением количества участников возникает потребность в большей интерактивности, и этот способ становится неэффективным. В таких случаях лучше использовать брокер сообщений, который управляет процессом обмена информацией и является посредником между отправителем и получателем.
Особенно он будет полезен для асинхронного взаимодействия микросервисов. Асинхронная связь не требует ожидания ответа в режиме реального времени. В качестве примера можно привести электронную почту, где пользователи могут отправить письмо и продолжить выполнять другие задачи.
Основные компоненты брокера сообщений:
- 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 применяют для мониторинга состояния очередей сообщений.
Надежные очереди гарантируют доставку сообщений в нужном порядке. Для их реализации используется команда BLMOVE. Она позволяет переносить элементы между списками, сохраняя при этом порядок элементов и обеспечивая блокировку в случае, когда список пустой. Если список source не обрабатывает сообщения до конца, команда blmove позволяет перенести сообщение в запасной список destination для дальнейшей обработки.
Рассмотрим синтаксис команды:
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeoutsource— название списка (источника), из которого извлекается элемент;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 и выше.
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.