Real-Time Notifications (WebSocket/SSE) — разработка и интеграция

Ваш сайт захлебывается от постоянных запросов при проверке новых событий? Мы внедряем систему мгновенных уведомлений на WebSocket или SSE, которая избавляет от лишней нагрузки на сервер. Наша команда реализует решение под ключ — от выбора протокола до интеграции и последующей поддержки, обеспечивая стабильную работу даже при пиковых нагрузках.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Real-Time Notifications (WebSocket/SSE) — разработка и интеграция
Средний
~3-5 дней
Часто задаваемые вопросы

Реализация Real-Time Notifications (WebSocket/SSE) на сайте

Интернет-магазин с 50 000 товаров: стандартный polling каждые 5 секунд генерирует 10 000 запросов в минуту — база данных падает, серверное время сжигается впустую. Переход на SSE (Server-Sent Events) снижает нагрузку в 10 раз: одно постоянное соединение вместо десятков тысяч коротких. Мы интегрируем систему мгновенных уведомлений на WebSocket или SSE — оповещения без перезагрузки страницы. За 2–3 дня получаете готовое решение под ключ с гарантией стабильности при 10 000+ одновременных подключениях. Опыт нашей команды — 10+ лет в продакшене highload-проектов. Это позволяет не только снизить нагрузку на сервер, но и сократить бюджет на инфраструктуру до 40%.

WebSocket vs SSE: когда что использовать

SSE — однонаправленный поток от сервера к клиенту через обычный HTTP/2. Работает через EventSource, автоматически переподключается, не требует библиотек. Идеален для: новых сообщений, обновлений статуса, алертов, системных оповещений.

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

Критерий SSE WebSocket
Направление Сервер→Клиент Двунаправленный
Протокол HTTP/2 ws://
Автоподключение Встроено Нужна реализация
Библиотеки на клиенте EventSource (встроен) ws/socket.io
Кейсы Уведомления Чат, игры

На практике для уведомлений в 80% проектов достаточно SSE. WebSocket добавляем, когда нужна двусторонняя логика (подтверждение прочтения, typing indicator).

Реализация SSE на Node.js

// server/routes/notifications.ts
import { Router, Request, Response } from 'express';
import { authMiddleware } from '../middleware/auth';

const router = Router();
const clients = new Map<string, Set<Response>>();

router.get('/stream', authMiddleware, (req: Request, res: Response) => {
  const userId = req.user!.id;
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'X-Accel-Buffering': 'no', // важно для nginx
  });

  const heartbeat = setInterval(() => {
    res.write(':heartbeat\n\n');
  }, 30_000);

  if (!clients.has(userId)) clients.set(userId, new Set());
  clients.get(userId)!.add(res);

  getUnreadNotifications(userId).then((notifications) => {
    res.write(sseEvent('init', notifications));
  });

  req.on('close', () => {
    clearInterval(heartbeat);
    clients.get(userId)?.delete(res);
    if (clients.get(userId)?.size === 0) clients.delete(userId);
  });
});

function sseEvent(type: string, data: unknown, id?: string): string {
  let msg = '';
  if (id) msg += `id: ${id}\n`;
  msg += `event: ${type}\n`;
  msg += `data: ${JSON.stringify(data)}\n\n`;
  return msg;
}

export function pushNotification(userId: string, notification: Notification) {
  const userClients = clients.get(userId);
  if (!userClients) return;
  const msg = sseEvent('notification', notification, notification.id);
  userClients.forEach((res) => res.write(msg));
}

export default router;

Клиентская часть — стандартный EventSource с экспоненциальным backoff при ошибках. Интегрируем с любой библиотекой toast (sonner, react-hot-toast).

Масштабирование SSE с Redis Pub/Sub

При горизонтальном масштабировании (несколько инстансов) пользователь может быть подключён к инстансу A, а уведомление сгенерировано инстансом B. Решение — Redis Pub/Sub:

import { createClient } from 'redis';
const pub = createClient({ url: process.env.REDIS_URL });
await pub.connect();
async function emitNotification(userId: string, notification: Notification) {
  await db.notifications.create({ data: notification });
  await pub.publish(`notifications:${userId}`, JSON.stringify(notification));
}

Каждый инстанс подписывается на все каналы и доставляет только своим клиентам. Nginx требует отключения буферизации:

location /api/notifications/stream {
    proxy_pass http://app_backend;
    proxy_buffering off;
    proxy_cache off;
    proxy_read_timeout 3600s;
    proxy_set_header Connection '';
    chunked_transfer_encoding on;
}

Группировка уведомлений для снижения нагрузки

При массовой рассылке (например, 100 уведомлений в секунду) клиент получает отдельный SSE-event на каждое. Эффективнее группировать с debounce 200 мс:

const pendingByUser = new Map<string, Notification[]>();

function bufferNotification(userId: string, notification: Notification) {
    if (!pendingByUser.has(userId)) {
        pendingByUser.set(userId, []);
        setTimeout(() => flushUser(userId), 200);
    }
    pendingByUser.get(userId)!.push(notification);
}

function flushUser(userId: string) {
    const batch = pendingByUser.get(userId) ?? [];
    pendingByUser.delete(userId);
    if (batch.length === 1) {
        pushToClient(userId, sseEvent('notification', batch[0]));
    } else {
        pushToClient(userId, sseEvent('notifications:batch', batch));
    }
}

Это снижает нагрузку на клиент (одно событие вместо многих) и на сервер (меньше вызовов write). На практике батчинг уменьшает число пакетов до 90%, что экономит сетевые ресурсы и бюджет.

Процесс разработки системы уведомлений

  1. Анализ требований и выбор технологии (SSE/WebSocket) с учётом архитектуры проекта.
  2. Проектирование схемы потоков: Redis, nginx, авторизация через JWT.
  3. Реализация серверной части (Node.js/Express) и клиентской интеграции (React, Vue, любой фреймворк).
  4. Нагрузочное тестирование до 10k+ соединений с симуляцией 1000+ уведомлений в секунду.
  5. Документация (API, конфиги, инструкция по развёртыванию).
  6. Поддержка после запуска — 1 месяц бесплатно.

Ориентировочные сроки и стоимость

Реализация SSE-уведомлений с Redis: от 2 до 3 дней. Добавление WebSocket с двусторонней логикой (read receipts, typing): ещё 1 день. Стоимость рассчитывается индивидуально — оценим ваш проект. Свяжитесь с нами, чтобы получить коммерческое предложение.

Безопасность канала: JWT и Redis

Используем JWT-аутентификацию: при установке SSE-соединения токен проверяется в middleware. Для WebSocket — аналогично. Redis Pub/Sub изолирует каналы по userId. Дополнительно настраиваем rate limiting на уровне nginx (50 запросов в секунду на клиент). Такая схема гарантирует, что уведомления получает только авторизованный пользователь.

Преимущества SSE перед polling

SSE использует HTTP/2, что даёт мультиплексирование и меньшее потребление ресурсов по сравнению с polling. Задержка доставки менее 100 мс, а нагрузка на сервер в 5–10 раз ниже. При этом клиентский API — нативный EventSource, не требующий дополнительных библиотек. Для 95% проектов (уведомления, алерты, обновления статуса) SSE — оптимальный выбор.

Вот кейс из практики: клиент с 100 000 пользователей перешёл с polling на SSE — нагрузка на базу данных упала на 80%, а время доставки уведомлений сократилось с 5 секунд до 200 мс. Это позволило сэкономить на серверной инфраструктуре более 40% бюджета.

Этап Длительность Результат
Анализ и выбор технологии 0.5 дня Архитектурная схема
Реализация SSE + Redis 1.5 дня Работающий эндпоинт /stream
Клиентская интеграция 0.5 дня Toast-уведомления на сайте
Нагрузочное тестирование 0.5 дня Подтверждение 10k+ соединений
Документация 0.5 дня README, конфиги, инструкция

Получите консультацию — расскажем, как внедрить уведомления без просадки производительности. Оценим ваш проект — просто напишите нам.

Подход описан в документации EventSource и Redis Pub/Sub.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060