EMZETT.
Войти

Pusher

Коротко: Размещаемый сервис для коммуникации в реальном времени (WebSockets) между сервером и браузером — например, чтобы сообщение чата сразу появлялось во всех других открытых окнах браузера без перезагрузки страницы.

Подробнее: В браузере вы подписываетесь на «канал»; сервер «публикует» события в этом канале, а Pusher пересылает их в реальном времени всем подключённым клиентам. Приватным каналам (например, личным чатам) нужна отдельная конечная точка сервера (auth endpoint), которая при каждой попытке подключения проверяет, вправе ли пользователь вообще получить доступ к этому каналу.

Наш контекст: В Emzett он обеспечивает внутренний чат команды, открытый чат сообщества и новые личные сообщения между друзьями — все три используют одну и ту же существующую auth-точку Pusher, но с разными проверками доступа перед ней.

Подробности

Коммуникацию в реальном времени в вебе можно решить в основном двумя способами: polling (браузер сам через короткие промежутки спрашивает «есть что-нибудь новое?») или соединение WebSocket (сервер и браузер держат постоянно открытое соединение, по которому обе стороны могут в любой момент отправлять сообщения, без нового запроса). Polling проще построить, но он создаёт лишний трафик и заметную задержку; WebSocket мгновенны, но самостоятельно их эксплуатировать сложнее — постоянно открытый сокет на каждого подключённого пользователя нетривиально масштабируется сразу на многие экземпляры сервера. Сервисы вроде Pusher берут на себя именно эту проблему масштабирования и предлагают вместо этого простой API публикации/подписки.

Концепция каналов знает три уровня видимости: публичные каналы (любой может подписаться без проверки), приватные каналы (при подписке нужна серверная проверка авторизации) и presence-каналы (как приватные, дополнительно с автоматическим списком тех, кто сейчас онлайн — удобно для индикаторов «онлайн» в чате).

// Сервер: отправить событие в канал
await pusher.trigger(`chat-${roomId}`, "new-message", { text, userId })
// Браузер: получить событие
pusherClient.subscribe(`chat-${roomId}`).bind("new-message", (data) => { ... })

Обрывы соединения и переподключения

Соединение WebSocket может оборваться в любой момент — меняется мобильная сеть, ненадолго пропадает Wi-Fi, ноутбук уходит в режим ожидания. Клиент Pusher автоматически переподключается в фоне, но сообщения, отправленные ВО ВРЕМЯ перерыва, для этого клиента теряются, если приложение дополнительно не сохраняет их постоянно (например, в базе данных) и не запрашивает потом при переподключении. Для чата это означает: Pusher обеспечивает «живую» доставку, а настоящая история сообщений всё равно должна храниться отдельно — сам Pusher не хранилище, а лишь механизм доставки.

Presence-каналы подробнее

Presence-каналы расширяют приватные автоматически управляемыми списками участников: как только клиент успешно подписывается, срабатывает событие pusher:subscription_succeeded со всеми присутствующими сейчас пользователями; затем pusher:member_added/pusher:member_removed сообщают о входах/выходах в реальном времени — удобно для индикаторов «кто сейчас онлайн», без необходимости воссоздавать это собственными heartbeat-запросами.

См. также: Ограничение частоты запросов, Сокеты, Сервис