Skip to content

Redis Pub/Sub

Преимущества и недостатки

Скорее всего в вашем проекте уже используется Redis. Если вы хотите использовать асинхронную отправку сообщений, но не хотите внедрять новую тяжеловесную зависимость (Kafka, RabbitMQ, Nats и тд) в свою инфраструктуру, вам стоит воспользоваться им в качестве брокера сообщений.

Redis работает быстро, не деградирует при большом количестве сообщений и самое главное - он уже у вас есть!

Note

Подробнее с документацией Redis Pub/Sub вы можете ознакомиться на официальном сайте

Однако, Redis в качестве брокера сообщений обладает некоторыми существенными недостатками:

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

Далеко не все эти особенности необходимы в вашем проекте, но вы должны иметь их в виду, когда выбираете Redis в качестве брокера сообщений.

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

Также, Redis 5.0+ содержит механизм Streams, который также может служить в роли брокера сообщений и закрывает основные недостатки Redis Pub/Sub: персистентность сообщений и масштабирование потребителей.

Правила маршрутизации

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

Оба примера рассмотрены чуть далее.

Особенности Propan

Так как Redis в качестве сообщения использует просто набор байт без заголовков и прочей метаинформации, Propan в качестве сообщения использует закодированный json со следующей структурой:

{
    "data": "",
    "headers": {},
    "reply_to": ""
}

Это необходимо для корреткного распознавания content-type входящего сообщения (необходимо для правильного декодирования) и поддержки RPC запросов.

Если Propan получает сообщение, отправленное с помощью другой библиотеки или фреймворка (или просто сообщение другого формата), все тело этого сообщение будет воспринято как поле data принимаемого сообщения, а content-type будет распознан автоматически.

При этом RPC запросы не будут работать, так как во входящем сообщении нет поля reply_to.