Гайды

Redis Pub/Sub и очереди через Lists

SUBSCRIBE и ограничения, BRPOP и BRPOPLPUSH, сравнение с Streams, когда смотреть на внешний брокер.

~10 мин чтения

Redis Pub/Sub и очереди через Lists

Два разных паттерна: Pub/Sub — сообщения «здесь и сейчас» подписчикам; Lists — структура для простых очередей с блокирующим чтением. Базовые типы и кеш — в «Основы Redis: кеш и структуры данных». Для очередей с группами и ack чаще смотрят на Redis Streams (отдельная тема; ниже — краткое сравнение). Для распределённого журнала уровня Kafka — введение в Kafka.


1. Pub/Sub: fire and forget

PUBLISH в канал; подписчики SUBSCRIBE получают копию только если подключены в момент публикации.

redis
SUBSCRIBE news.alerts
# в другом клиенте:
PUBLISH news.alerts "service degraded in eu-west"

Ограничения

  • Нет персистентности — отвалился подписчик, сообщения потеряны.
  • По сути at-most-once для доставки до приложения.
  • В режиме SUBSCRIBE то же соединение не выполняет обычные команды — нужен второй клиент или пул.

Когда уместно

Инвалидация кеша по каналу, сигналы «перечитай конфиг», уведомления, где потеря единичного сообщения допустима.


2. PSUBSCRIBE

redis
PSUBSCRIBE news.*

Следите за числом паттернов и нагрузкой на CPU.


3. Очередь на Lists: producer / consumer

redis
LPUSH q:email:pending "{\"id\":1,\"to\":\"a@b.c\"}"
BRPOP q:email:pending 30

BRPOP — блокировка до таймаута; удобно для цикла worker без busy-wait.

Несколько consumer'ов на одном ключе — Redis раздаёт задачи; идемпотентность обработки на приложении всё равно нужна.


4. Надёжность: RPOPLPUSH / BRPOPLPUSH

Атомарный перенос в список «в обработке»:

redis
BRPOPLPUSH q:email:pending q:email:processing 30
LREM q:email:processing 1 "{\"id\":1,...}"

При старте worker — восстановление из processing по таймауту (visibility timeout вручную).


5. Ограничения List-очередей

АспектLists
ПерсистентностьЗависит от RDB/AOF Redis
Повторная доставкаПроектировать явно
Consumer groupsНет как в Streams
ПриоритетыНесколько списков или ZSET по score

6. Redis Streams (ориентир)

Streams (XADD, XREADGROUP, XACK): лог с ID, consumer groups, ack, MAXLEN. Для очередей с подтверждением Streams обычно удобнее «голого» List.

Минимальный producer / consumer group:

redis
XADD orders * order_id 1001 status created
XGROUP CREATE orders cg1 $ MKSTREAM
XREADGROUP GROUP cg1 consumer1 COUNT 10 BLOCK 5000 STREAMS orders >
XACK orders cg1 <id-из-ответа-XREADGROUP>

BLOCK даёт почти тот же UX, что BRPOP, но с pending entries list (PEL) для незавершённых сообщений. Периодически вызывайте XAUTOCLAIM или обходите PEL по таймауту visibility.


7. Сравнение сценариев

ЗадачаИнструмент в Redis
Broadcast без гарантииPub/Sub
Простая очередьList + BRPOP / BRPOPLPUSH
Очередь с группами и ackStreams
События с долгой ретенцией и множество сервисовЧасто внешний брокер — см. Kafka: основы

8. Операционные советы

  • Префиксы ключей по окружению (q:prod:…).
  • LLEN и latency BRPOP.
  • Большие payload — в объектное хранилище, в очереди ссылка.
  • Pub/Sub при высокой частоте — сеть и число подписчиков.

См. также