intermediate

SSE and long polling

Используйте one-way streaming или polling, когда важны browser compatibility, proxies, retry semantics и simpler infrastructure.

Когда сервер пушит обновления, а клиенту нужен только **one-way** stream, SSE и long polling часто проще WebSockets.

**Server-Sent Events (SSE)** — HTTP-ответ остаётся открытым; сервер пишет кадры `text/event-stream`:

					GET /events/orders
Accept: text/event-stream

HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache

event: order.created
id: 1024
data: {"orderId":"ord_9"}

: keepalive

event: order.updated
id: 1025
data: {"orderId":"ord_9","status":"SHIPPED"}
				

Браузерный `EventSource` автоматически переподключается и шлёт `Last-Event-ID` для resume. Прокси не должны бесконечно буферизовать SSE — настройте nginx/load balancers.

**Long polling**: клиент запрашивает; сервер держит до события или timeout, затем клиент сразу переподключается. Больше overhead, работает везде, где есть HTTP.

| | SSE | Long polling | WebSocket | |---|-----|--------------|-----------| | Направление | server → client | server → client | двунаправленный | | Browser API | EventSource | fetch/XHR | WebSocket | | Binary | нет (text) | да | да |

На интервью: SSE для notification feeds, long polling при legacy-ограничениях, proxy buffering pitfalls.

Типовые ошибки: нет обработки Last-Event-ID, нет keepalive comments, CORS на EventSource, long poll timeouts без client backoff.

Компромисс: простота и HTTP compatibility против bidirectional needs — не выбирайте WebSocket по умолчанию для one-way feeds.

Чеклист:

  • SSE для one-way text events с resume ids.
  • Keepalive и согласование proxy timeout.
  • Exponential backoff при reconnect.
  • Long poll только если SSE заблокирован.