Обновления в реальном времени с Server-Sent Events (SSE)
Лёгкий односторонний канал для живых данных поверх обычного HTTP
text/event-stream и просто никогда не заканчивается. Для дашбордов, уведомлений, биржевых тикеров и индикаторов прогресса -- везде, где данные текут сервер -> клиент и почти никогда обратно -- SSE зачастую проще и надёжнее полноценного WebSocket. С WebSocket вы уже познакомились в этом курсе; здесь вы получаете более лёгкий инструмент для многих односторонних случаев.
- объяснить, как SSE передаёт события через один keep-alive HTTP-ответ;
- писать формат
text/event-stream-- поляid,event,data,retryи комментарии; - принимать поток в браузере через
EventSourceи именованные события; - использовать автоматическое переподключение и
Last-Event-ID, чтобы возобновляться без пропусков; - поддерживать соединение живым с помощью heartbeat и побеждать буферизацию прокси;
- честно решать, когда подходит SSE, а когда WebSocket.
1. Что такое SSE и зачем это нужно
Классический способ получать свежие данные с сервера -- это опрос (polling): клиент каждые несколько секунд спрашивает "есть что-то новое?". Опрос тратит запросы, когда ничего не изменилось, и всё равно добавляет задержку, когда изменение появляется. SSE переворачивает это. Клиент открывает соединение один раз, а сервер держит этот ответ открытым и записывает в него новые события по мере их появления. Браузер предоставляет для этого крошечный встроенный API под названием EventSource.
Поскольку транспорт -- это обычный HTTP, SSE наследует всё, что HTTP уже даёт: он работает через тот же порт, что и ваше веб-приложение, проходит через файрволы и прокси, разрешающие обычный веб-трафик, и легко защищается TLS и cookie. Не нужно открывать в инфраструктуре отдельный протокол.
Аналогия. Опрос -- это как звонить на вокзал каждую минуту и спрашивать, не опаздывает ли поезд. SSE -- это радиотрансляция: вы настраиваетесь один раз, и объявления приходят по мере событий. По радио вы не отвечаете -- и для расписания это не нужно. Именно под эту одностороннюю форму и создан SSE.
SSE -- это стандарт браузера (часть HTML), поэтому клиентскую часть не нужно изобретать: переподключение, разбор событий и обработку Last-Event-ID за вас делает EventSource. Ваша задача на сервере -- лишь правильно говорить на простом формате.