Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Рассылка
Redis Pub/Sub передаёт сообщение подпискам, подключённым в момент публикации, и ничего не хранит для остальных.
Схема текстом
- Издатель PUBLISH news → Канал news ничего не хранит: публикация
- Канал news ничего не хранит → Подписка A подключена
- Канал news ничего не хранит → Подписка B подключена
- Подписка A подключена → Буфер клиента по умолчанию 32
- Буфер клиента по умолчанию 32 → Обработчик
- Подписалась позже: не увидит
- Обработчик, отстающий от буфера, теряет самые старые сообщения
Канал - это имя, а не ключ: 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.