- Home »

Создание realtime приложений с Node.js и Server-Sent Events
Сегодня поговорим о том, как быстро и просто поднять realtime-приложение на Node.js с помощью Server-Sent Events (SSE). Если ты когда-нибудь задумывался, как сделать так, чтобы сервер сам пушил данные в браузер без постоянных запросов от клиента — добро пожаловать. Эта статья для тех, кто не хочет городить огород из WebSocket’ов, но хочет получить живую ленту событий, мониторинг, уведомления или просто обновление данных в реальном времени. Разберёмся, как это работает, как всё настроить за 15 минут, какие подводные камни бывают и почему SSE — это не только просто, но и круто для автоматизации и серверных скриптов.
Как это работает: Server-Sent Events простыми словами
Server-Sent Events — это технология, позволяющая серверу отправлять данные клиенту по HTTP в режиме реального времени. В отличие от WebSocket, тут всё проще: клиент открывает соединение, сервер по этому соединению шлёт события, а клиент их ловит. Всё работает поверх обычного HTTP/1.1, никаких особых протоколов, прокси и танцев с бубном.
- Клиент инициирует соединение через
EventSource
(стандартный API в браузерах). - Сервер держит соединение открытым и периодически отправляет данные в специальном формате.
- Если соединение рвётся — браузер сам переподключается.
Вот и всё. Никаких bidirectional-чатов, только сервер → клиент. Но для большинства задач этого более чем достаточно.
Почему SSE, а не WebSocket или polling?
Технология | Плюсы | Минусы | Когда использовать |
---|---|---|---|
Server-Sent Events (SSE) |
|
|
|
WebSocket |
|
|
|
HTTP Polling |
|
|
|
SSE — это золотая середина для большинства серверных задач, когда нужно просто и быстро отправлять данные клиенту.
Быстрый старт: как всё настроить за 15 минут
Погнали по шагам. Будем использовать Node.js (естественно), никакие сторонние библиотеки не нужны — всё делается на чистом HTTP.
-
Устанавливаем Node.js
Если ещё не стоит, ставим:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
Проверяем:
node -v
npm -v
-
Создаём проект
mkdir sse-demo
cd sse-demo
npm init -y
-
Пишем сервер
Открываемserver.js
:
const http = require('http');
const clients = [];http.createServer((req, res) => {
if (req.url === '/events') {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Access-Control-Allow-Origin': '*'
});
res.write('\n');
clients.push(res);
req.on('close', () => {
clients.splice(clients.indexOf(res), 1);
});
} else if (req.url === '/send') {
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', () => {
clients.forEach(client => {
client.write(`data: ${body}\n\n`);
});
res.end('ok');
});
} else {
res.writeHead(404);
res.end();
}
}).listen(3000, () => console.log('SSE server started on 3000'));
Запускаем:
node server.js
-
Пишем клиент
В браузере:
<script>
const es = new EventSource('http://localhost:3000/events');
es.onmessage = e => console.log('New event:', e.data);
</script>
Или curl:
curl http://localhost:3000/events
Для отправки события:
curl -X POST -d "Hello, SSE!" http://localhost:3000/send
Всё, у тебя работает realtime-стриминг! Можно усложнять, добавлять авторизацию, фильтрацию, хранить историю — но базовая схема уже готова.
Практические советы и схемы
-
Проксирование через nginx
SSE отлично работает через nginx, главное — не забыть проproxy_set_header Connection '';
и увеличить таймауты:
location /events {
proxy_pass http://localhost:3000;
proxy_set_header Connection '';
proxy_buffering off;
proxy_read_timeout 3600s;
}
-
Масштабирование
Если клиентов много — держи в голове, что каждое соединение = отдельный поток. Для крупных проектов — смотри в сторону кластеризации Node.js или внешних брокеров (Redis pub/sub). -
Безопасность
Не забывай про CORS, rate limiting и авторизацию. SSE — это обычный HTTP, все уязвимости те же. -
Мониторинг
SSE отлично подходит для стриминга логов, алертов, статусов задач. Можно сделать свой mini-Grafana или realtime-дашборд.
Положительные и отрицательные кейсы
Кейс | Плюсы | Минусы | Рекомендации |
---|---|---|---|
Realtime monitoring (CI/CD, логи, алерты) | Мгновенное обновление, простота, нет polling | Ограничения на количество соединений | Использовать SSE, если клиентов < 1000 на сервер |
Чат/мессенджер | Просто реализовать push-уведомления | Нет обратной связи клиент → сервер | Для простых уведомлений — SSE, для полноценного чата — WebSocket |
Массовые уведомления (новости, биржа, спорт) | Легко масштабировать через CDN/proxy | Проблемы с мобильными браузерами (фоновые вкладки) | Использовать push-уведомления для мобильных, SSE — для веба |
Полезные команды и инструменты
-
curl для тестирования SSE
curl http://localhost:3000/events
-
ab для нагрузки
ab -n 1000 -c 100 http://localhost:3000/events
-
pm2 для продакшена
npm install -g pm2
pm2 start server.js
Альтернативы и похожие решения
- Socket.io — если нужен bidirectional realtime, но сложнее и тяжелее.
- Primus — универсальный фреймворк для realtime, поддерживает SSE, WebSocket, polling.
- eventsource — полифил для Node.js и старых браузеров.
- MDN: Server-sent events — официальная документация.
Статистика и сравнение
- Согласно W3Techs, SSE используется на 0.1% сайтов, но в корпоративных и DevOps-решениях — гораздо чаще.
- В среднем, SSE держит соединение открытым 6-12 часов без проблем (если не мешает прокси/файрвол).
- В отличие от WebSocket, SSE не требует отдельного порта и легко интегрируется с существующими HTTP-сервисами.
Интересные факты и нестандартные применения
- Можно стримить не только текст, но и JSON, XML, даже base64-картинки (но осторожно с размером!).
- SSE отлично подходит для стриминга системных логов прямо в браузер — например, tail -f для веба.
- Можно использовать SSE для автоматизации: скрипты на bash с curl могут подписываться на события и запускать действия при получении новых данных.
- С помощью SSE можно реализовать “живые” CLI-интерфейсы: сервер шлёт прогресс, клиент отображает в терминале.
Новые возможности для автоматизации и скриптов
- CI/CD уведомления — стримить статус билда прямо в терминал или веб-интерфейс.
- Мониторинг серверов — получать алерты о нагрузке, ошибках, падениях сервисов в реальном времени.
- Интеграция с IoT — устройства могут слушать SSE-канал и реагировать на события (например, включать свет, если пришёл пуш).
- Автоматизация задач — скрипты могут подписываться на события и запускать нужные действия (например, backup, deploy, alert).
Выводы и рекомендации
Server-Sent Events — это недооценённая, но мощная технология для realtime-приложений на Node.js. Если тебе нужно быстро и просто реализовать стриминг данных с сервера на клиент — SSE твой выбор. Это идеальный вариант для мониторинга, алертов, уведомлений, realtime-дашбордов и автоматизации. Не требует сложной инфраструктуры, легко масштабируется и дружит с nginx, прокси и стандартными инструментами DevOps.
- Используй SSE для всех задач, где не нужен bidirectional-чат.
- Для продакшена — обязательно проксируй через nginx и используй pm2 для управления процессами.
- Не забывай про безопасность: CORS, авторизация, rate limiting.
- Для крупных нагрузок — смотри в сторону кластеризации и брокеров сообщений.
Если хочешь быстро развернуть свой сервер для SSE — заказывай VPS или выделенный сервер и экспериментируй. SSE — это просто, быстро и реально работает!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.