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-запитами.

Див. також: Обмеження частоти запитів, Сокети, Сервіс