Понимание SSE (Server-Sent Events) и их преимуществ
February 1, 2024
Введение
SSE (Server-Sent Events) — это односторонний протокол связи между клиентами и серверами, основанный на протоколе HTTP. Он позволяет серверам отправлять данные клиентам в реальном времени с использованием потоков событий, не требуя явных запросов от клиентов. Построенный на стандартном протоколе HTTP, SSE использует односторонние постоянные соединения, что позволяет серверам активно отправлять события и данные клиентам.

По сути, он реализован с использованием потокового подхода, при котором клиент инициирует запрос на соединение с сервером и поддерживает соединение открытым. Затем сервер активно отправляет сообщения клиенту. Данные, отправляемые с сервера на клиент с использованием Server-Sent Events (SSE), должны быть закодированы в UTF-8, а возвращаемый тип контента — text/event-stream. Например, при использовании ChatGPT, когда вы задаете ему вопрос, вы видите, как он отображает ответ слово за словом. На самом деле, ChatGPT активно "отправляет" предварительно вычисленные данные вам, используя технологию SSE для возврата данных во время вычислений, что позволяет избежать длительного ожидания интерфейса, которое может привести к закрытию страницы.

Преимущества SSE
-
Реальная связь в реальном времени: SSE предоставляет механизм связи в реальном времени, позволяя серверам активно отправлять данные клиентам. Эта возможность делает SSE особенно подходящим для приложений, требующих немедленных обновлений, таких как чаты в реальном времени, инструменты для онлайн-сотрудничества, отображение данных в реальном времени и доставка уведомлений.
-
Снижение нагрузки на сеть: По сравнению с традиционными методами опроса, SSE использует долгоживущие соединения. Через одно HTTP-соединение сервер может отправлять несколько событий клиенту, избегая частых HTTP-запросов и снижая нагрузку на сеть.
-
Легковесность: SSE основан на протоколе HTTP, поддерживается существующим серверным программным обеспечением и проще в использовании по сравнению с WebSocket.
-
Автоматическое переподключение: SSE может автоматически пытаться восстановить соединение после его разрыва без необходимости написания дополнительного кода. Этот механизм автоматического переподключения повышает стабильность системы, обеспечивая непрерывную связь даже в условиях нестабильной сети.
Проксирование SSE-сервисов с использованием API7 Enterprise
В практических приложениях использование API-шлюза для проксирования SSE-сервисов способствует повышению стабильности сервисов, решению проблем безопасности и кросс-доменных запросов, а также подходит для обработки сложных сценариев применения. NGINX, как один из самых популярных обратных прокси-серверов, занимает значительную долю рынка.
При проксировании SSE-сервисов на NGINX необходимо отключить proxy_buffering. Однако эта конфигурация должна быть отключена как минимум на уровне location, что означает, что если в системе есть несколько location, и только некоторые из них требуют отключения кэширования для поддержки SSE-сервисов, это может повлиять на производительность других API, не связанных с SSE. Кроме того, конфигурация proxy_buffering в NGINX не обладает гибкостью, так как не может быть динамически включена или отключена во время выполнения, что требует перезагрузки конфигурации для вступления в силу, что может привести к прерыванию сервиса.
API7 Enterprise предоставляет плагин proxy-buffering, позволяющий более гибко проксировать SSE-сервисы. Включив этот плагин в соответствующих маршрутах, вы можете легко управлять кэшированием без необходимости перезагрузки всей конфигурации. Эта гибкость удовлетворяет требованиям проксирования SSE-сервисов, а также решает проблемы производительности и динамической конфигурации.

Тестирование, приведенное ниже, подтверждает успешное проксирование SSE-сервисов.
curl "http://127.0.0.1:9080/.sse" -H "Accept: text/event-stream" event: server data: 27d365b177ae id: 1 event: request data: GET /.sse HTTP/1.1 data: data: Host: 127.0.0.1:9080 data: Accept: text/event-stream data: User-Agent: curl/8.1.2 data: X-Forwarded-For: 192.168.65.1 data: X-Forwarded-Host: 127.0.0.1 data: X-Forwarded-Port: 9080 data: X-Forwarded-Proto: http data: X-Real-Ip: 192.168.65.1 data: id: 2 event: time data: 2024-01-29T04:04:20Z id: 3 event: time data: 2024-01-29T04:04:21Z id: 4 ...
Заключение
В заключение, SSE подходит для сценариев, требующих связи и обновлений в реальном времени, предоставляя простой и эффективный способ достижения этого. Однако важно отметить, что SSE — это односторонний канал, позволяющий только серверам отправлять сообщения клиентам. Поэтому SSE может не подходить для всех типов потребностей в реальном времени. Для более сложных сценариев двусторонней связи могут быть более подходящими WebSocket или другие технологии.