Server-Sent Events: односторонний поток
Постоянный поток событий от сервера к браузеру — без всякого WebSocket, на обычном HTTP.
Server-Sent Events (SSE) — стандартный механизм, при котором сервер держит одно HTTP-соединение и шлёт по нему поток текстовых событий браузеру. Канал односторонний: сервер → браузер.
Зачем это нужно
Long-polling решает задержку, но остаётся серией отдельных запросов. SSE идёт дальше: браузер открывает одно соединение, и сервер шлёт по нему события сколько угодно, без переоткрытия. Идеально для лент новостей, нотификаций, тикера цен — всего, где данные текут только от сервера, а браузеру не нужно слать ответы по тому же каналу.
Как это выглядит в браузере
В браузере есть готовый объект EventSource. Он сам держит соединение и сам переподключается при обрыве.
// Браузер: подписываемся на поток событий
const es = new EventSource("/stream");
es.onmessage = (event) => {
console.log("Пришло:", event.data);
};
es.onerror = () => {
console.log("Обрыв — EventSource сам переподключится");
};Сервер отвечает с особым типом контента text/event-stream и шлёт строки специального формата:
data: Привет
data: Цена BTC: 65000
data: Новое сообщение в чате
Каждое событие — строка data: ..., события разделяются пустой строкой. Браузер сам разбирает формат и вызывает onmessage.
Как работает под капотом
SSE — это обычный HTTP-ответ, который никогда не заканчивается: сервер держит соединение и дописывает в тело новые строки. Браузер читает тело по мере поступления. Плюс протокол сам умеет переподключаться и восстанавливать пропущенные события через заголовок Last-Event-ID. Минус — канал строго односторонний: чтобы отправить что-то серверу, браузер делает отдельный обычный HTTP-запрос.
SSE против WebSocket — коротко
| Признак | SSE | WebSocket |
| Направление | сервер → браузер | в обе стороны |
| Авто-реконнект | встроен | пишешь сам |
| Данные | только текст | текст и бинарные |
| Поверх чего | обычный HTTP | отдельный протокол |
Частые ошибки
- Брать SSE для чата. В чате браузер тоже шлёт сообщения — нужен двусторонний канал, тут лучше WebSocket.
- Забыть про лимит соединений. В HTTP/1.1 браузер держит ограниченное число соединений на домен; много вкладок с SSE могут упереться в лимит (в HTTP/2 проблема снимается).
Итоги
- SSE — постоянный односторонний поток событий сервер → браузер поверх обычного HTTP.
- В браузере используется
EventSourceсо встроенным авто-реконнектом. - Подходит для лент, нотификаций, тикеров; для двустороннего обмена (чат) — WebSocket.