Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Рассылка

Redis Pub/Sub передаёт сообщение подпискам, подключённым в момент публикации, и ничего не хранит для остальных.

Pub/Sub: публикация доходит до подписок, подключённых в этот момент, каждая через буфер своего клиентаИздательPUBLISH newsКанал newsничего не хранитПодписка AподключенаПодписка BподключенаПодписаласьпозже:не увидитБуфер клиентапо умолчанию 32ОбработчикОбработчик, отстающий от буфера,теряет самые старые сообщения
Схема текстом
  1. Издатель PUBLISH news → Канал news ничего не хранит: публикация
  2. Канал news ничего не хранит → Подписка A подключена
  3. Канал news ничего не хранит → Подписка B подключена
  4. Подписка A подключена → Буфер клиента по умолчанию 32
  5. Буфер клиента по умолчанию 32 → Обработчик
  6. Подписалась позже: не увидит
  7. Обработчик, отстающий от буфера, теряет самые старые сообщения

Канал - это имя, а не ключ: Redis ничего под ним не хранит. PUBLISH передаёт сообщение каждому клиенту, подписанному на канал в этот момент. Redis называет такую доставку at-most-once: клиент, который не подписан или потерял соединение, сообщение не получит (Pub/Sub).

Каждая подписка RedisPubSub открывает собственный клиент и подписывает его на канал. У классической подписки этот шаг при запуске сервиса завершается, только когда сервер ответил на PING, отправленный вслед за SUBSCRIBE по тому же соединению, поэтому сообщение, опубликованное после подписки, до неё доходит. RedisPubSubPattern подписывается на шаблон в стиле glob командой PSUBSCRIBE и получает сообщения каждого подходящего канала.

Сообщение ждёт в буфере клиента, пока обработчик его не заберёт. Буфер вмещает 32 сообщения, значение fred по умолчанию, если buffer не задаёт другой размер. Отстающая подписка теряет самые старые сообщения и пишет в журнал предупреждение с именем канала и числом потерянных сообщений.

Классический Pub/Sub рассылает каждое сообщение на все узлы кластера. Шардированный Pub/Sub (SSUBSCRIBE и SPUBLISH, начиная с Redis 7.0) закрепляет канал за хеш-слотом и держит его сообщения внутри этого шарда. PubSubMode выбирает один из режимов, и подписка в одном режиме не получает того, что опубликовано в другом.

Доставке Pub/Sub нечего завершать: ack и nack возвращают AckError::Unsupported.