Основные данныеРеальное время

Чат и уведомления в реальном времени

Рассылайте сообщения всем подключённым клиентам в реальном времени, с шардированными каналами для кластеров и потоками для истории.

публикация, каждый подписчик
1
каналы для кластеров
Шардированные
с потоками
+история
Шаг 1 из 5
Серверы подписываются

Каждый сервер WebSocket подписывается на комнаты, в которых находятся его подключённые пользователи.

Пример сеансаplaying
# Серверы подписываются
hotkv> SUBSCRIBE room:42
1) "subscribe"
2) "room:42"
3) (integer) 1

Анимированная демонстрация с настоящими командами HotKV и примерами ответов. Нажмите на любой шаг, чтобы перейти к нему. Команды и ответы остаются на английском, ровно так, как вы вводите и видите их в HotKV.

Проблема

Чат-комната или живая лента уведомлений должна доходить до каждого подключённого пользователя одновременно, через множество серверов WebSocket. Опрос базы данных слишком медленный и дорогой, а серверам нужен общий способ сообщать друг другу, что что-то произошло.

Как с этим справляется HotKV

Каждый сервер WebSocket подписывается на каналы, которые интересуют его пользователей. Когда что-то происходит, один PUBLISH доходит до каждого подписанного сервера, который пересылает его своим пользователям. Шардированные каналы удерживают трафик на узле, которому принадлежит канал в кластере, а поток рядом с каждой комнатой хранит историю для тех, кто присоединится позже.

Шаг за шагом

Что происходит, команда за командой

  1. 01

    Серверы подписываются

    Каждый сервер WebSocket подписывается на комнаты, в которых находятся его подключённые пользователи.

    SUBSCRIBE room:42
  2. 02

    Алиса отправляет сообщение

    Её сервер публикует один раз. В ответе указано, сколько подписчиков получили сообщение.

    PUBLISH room:42 "{\"from\":\"alice\",\"text\":\"Deploy is green\"}"
  3. 03

    Сохраняем историю

    Сообщение также добавляется в поток комнаты, ограниченный последними 1000 сообщений.

    XADD room:42:history MAXLEN ~ 1000 * from alice text "Deploy is green"
  4. 04

    Боб подключается позже

    Он читает последние 50 сообщений из потока, затем переходит на канал в реальном времени.

    XREVRANGE room:42:history + - COUNT 50
  5. 05

    Шардированные каналы в кластере

    В режиме кластера SPUBLISH оставляет сообщение на узле, которому принадлежит канал.

    SPUBLISH room:{42}:typing "alice"
Где это уместно

Реальные сценарии

Командный чат и чат поддержки

Сообщения рассылаются на каждый сервер, держащий соединение участника, а поток даёт новичкам предысторию.

Живые уведомления

Обновления заказов, упоминания и оповещения отправляются в браузер в момент возникновения.

Совместные приложения

Положения курсоров и индикаторы набора текста рассылаются по короткоживущим каналам.

Встроено

Что вы получаете

Рассылка

Одна публикация доходит до каждого подписчика.

PUBLISHSUBSCRIBE

Подписки по шаблону

Подпишитесь на room:*, чтобы получать каждую комнату.

PSUBSCRIBE

Шардированный pub/sub

Каналы остаются на узле, которому принадлежат в кластере.

SPUBLISHSSUBSCRIBE

История

Соедините канал с ограниченным потоком для пропущенных пользователями сообщений.

XADDXREVRANGE

Частые вопросы

Сохраняются ли сообщения pub/sub?

Нет. Pub/sub доставляет тем, кто подписан в данный момент. Используйте поток рядом с каналом, если пользователям нужна история.

Работает ли это в кластере?

Да. Используйте шардированный pub/sub (SPUBLISH, SSUBSCRIBE), чтобы трафик каждого канала оставался на узле, которому он принадлежит.

Можно ли получать уведомления об изменении ключей?

Да. Уведомления о пространстве ключей публикуют события об изменениях ключей. См. документацию об уведомлениях о пространстве ключей.

Связанные сценарии

Попробуйте на своей нагрузке

HotKV понимает протокол Redis, поэтому вы можете подключить к нему существующий клиент и выполнить те же команды.