Як працюють веб-пуш-сповіщення зсередини

Ви бачите сповіщення про нові повідомлення, оновлення замовлень або нагадування про оплату.

Це виглядає просто. Ваш бекенд надсилає повідомлення, і користувач його отримує.

Насправді цей процес складається з багатьох компонентів. Ваш бекенд ніколи не спілкується з браузером напряму. Замість цього він використовує Push Service.

Google Chrome використовує Firebase Cloud Messaging. Firefox використовує Mozilla Push Service.

Робочий процес виглядає так:

Backend → Push Service → Browser → Service Worker → Користувач

Ось як побудувати таку систему за допомогою React та Golang.

Компоненти

  1. Frontend (React): запитує дозвіл і реєструє Service Worker.
  2. Service Worker: фоновий скрипт, який працює в браузері. Він обробляє події, навіть коли ваш вебсайт закрито.
  3. Backend (Golang): зберігає підписки та надсилає зашифровані повідомлення.
  4. Push Service: посередник, який доставляє повідомлення в браузер.

Процес підписки

Щоб надіслати повідомлення, вам потрібна підписка.

  • Користувач надає дозвіл.
  • Браузер генерує об'єкт підписки, що містить endpoint та ключі безпеки.
  • Ваш React-додаток надсилає цей об'єкт на ваш Golang-бекенд.
  • Ваш бекенд зберігає його в базі даних.

Ви повинні використовувати VAPID-ключі для ідентифікації вашого сервера. Використовуйте публічний ключ для фронтенду та приватний ключ для бекенду. Ніколи не поширюйте свій приватний ключ.

Реалізація

У React ви реєструєте Service Worker для прослуховування push-подій. Цей воркер працює у фоновому режимі. Він отримує дані та показує сповіщення користувачеві.

У Golang ви використовуєте бібліотеку для обробки шифрування та VAPID-автентифікації. Ваш сервер зчитує підписку з бази даних, шифрує payload і надсилає його в push-сервіс браузера.

Масштабування для продакшену

Проста конфігурація підходить для невеликих проєктів. Велика система потребує більшого.

  • Обробка кількох пристроїв: один користувач може мати телефон і ноутбук. Зберігайте кілька підписок для кожного користувача.
  • Очищення даних: термін дії підписок закінчується. Якщо ви отримуєте помилку 404 або 410, видаліть цю підписку з вашої бази даних.
  • Використання черг: для мільйонів користувачів використовуйте Kafka або подібні інструменти. Це дозволить вашій системі обробляти сповіщення асинхронно.
  • Впровадження повторних спроб: використовуйте exponential backoff для обробки збоїв мережі.

WebSockets добре підходять для живих чатів, коли користувач активний. Web Push краще підходить для зв'язку з користувачами, коли вкладка закрито.

Джерело: https://dev.to/chandu_bobbili_06/how-web-push-notifications-work-internally-implementing-with-react-golang-6m