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 — коротко

ПризнакSSEWebSocket
Направлениесервер → браузерв обе стороны
Авто-реконнектвстроенпишешь сам
Данныетолько тексттекст и бинарные
Поверх чегообычный HTTPотдельный протокол

Частые ошибки

  • Брать SSE для чата. В чате браузер тоже шлёт сообщения — нужен двусторонний канал, тут лучше WebSocket.
  • Забыть про лимит соединений. В HTTP/1.1 браузер держит ограниченное число соединений на домен; много вкладок с SSE могут упереться в лимит (в HTTP/2 проблема снимается).

Итоги

  • SSE — постоянный односторонний поток событий сервер → браузер поверх обычного HTTP.
  • В браузере используется EventSource со встроенным авто-реконнектом.
  • Подходит для лент, нотификаций, тикеров; для двустороннего обмена (чат) — WebSocket.
Проверьте себя
1. Главное ограничение Server-Sent Events:
AРаботает только в Chrome
BКанал односторонний: только сервер → браузер
CНе умеет переподключаться
DТребует отдельного TCP-порта
2. Какой объект в браузере подписывается на поток SSE?
AWebSocket
BEventSource
CXMLHttpRequest
Dfetch