Server Side Events (SSE)
Server-Sent Events (SSE) — это технология, которая позволяет серверу отправлять данные клиенту в реальном времени через одно HTTP-соединение. В отличие от WebSockets, SSE поддерживает только одностороннюю связь: сервер отправляет данные клиенту, но клиент не может отправлять данные серверу через SSE. Это делает SSE идеальным для сценариев, где серверу нужно "толкать" данные клиенту, например, для уведомлений, обновлений статуса или потоковой передачи данных.
Основные особенности SSE:
- Односторонняя связь: Сервер отправляет данные клиенту.
- Простота: Использует стандартный HTTP-протокол.
- Автоматическое восстановление соединения: Если соединение разрывается, клиент автоматически пытается восстановить его.
- Поддержка браузеров: SSE поддерживается большинством современных браузеров.
Как работает SSE:
- Клиент создает соединение с сервером с помощью EventSource.
- Сервер отправляет данные в формате текстового потока.
- Клиент обрабатывает данные с помощью событий.
Использование SSE в React:
В React SSE можно использовать с помощью встроенного объекта EventSource. Ниже приведен пример реализации.
import React, { useState, useEffect } from 'react';
function SSEDemo() {
const [messages, setMessages] = useState([]);
useEffect(() => {
// Создаем соединение с сервером
const eventSource = new EventSource('https://api.example.com/sse');
// Обработчик события "message"
eventSource.onmessage = (event) => {
const newMessage = event.data;
setMessages((prevMessages) => [...prevMessages, newMessage]);
};
// Обработчик события "error"
eventSource.onerror = (error) => {
console.error('SSE error:', error);
eventSource.close(); // Закрываем соединение при ошибке
};
// Очистка при размонтировании компонента
return () => {
eventSource.close();
};
}, []);
return (
<div>
<h1>Server-Sent Events (SSE) Demo</h1>
<ul>
{messages.map((message, index) => (
<li key={index}>{message}</li>
))}
</ul>
</div>
);
}
export default SSEDemo;
Объяснение:
- EventSource:
- Создается объект
EventSource, который подключается к серверу по указанному URL. - Сервер должен поддерживать SSE и отправлять данные в формате текстового потока.
- Создается объект
- События:
onmessage:Обрабатывает данные, полученные от сервера.onerror:Обрабатывает ошибки соединения.
- Очистка:
- При размонтировании компонента соединение закрывается с помощью
eventSource.close().
- При размонтировании компонента соединение закрывается с помощью
Пример серверной реализации (Node.js + Express):
Для работы SSE сервер должен поддерживать отправку данных в формате текстового потока.
const express = require('express');
const app = express();
app.get('/sse', (req, res) => {
// Устанавливаем заголовки для SSE
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
// Отправляем данные клиенту каждые 2 секунды
const intervalId = setInterval(() => {
const data = `Server time: ${new Date().toLocaleTimeString()}`;
res.write(`data: ${JSON.stringify(data)}\n\n`); // Формат SSE
}, 2000);
// Очистка при разрыве соединения
req.on('close', () => {
clearInterval(intervalId);
res.end();
});
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
Объяснение серверной части:
- Заголовки:
Content-Type: text/event-stream:Указывает, что это поток событий.Cache-Control: no-cache:Отключает кэширование.Connection: keep-alive:Поддерживает соединение открытым.
- Формат данных:
- Данные отправляются в формате
data: <message>\n\n.
- Данные отправляются в формате
- Интервал:
- Сервер отправляет данные клиенту каждые 2 секунды.
Преимущества SSE:
- Простота: Легко реализовать как на клиенте, так и на сервере.
- Автоматическое восстановление: Клиент автоматически переподключается при разрыве соединения.
- Эффективность: Меньше нагрузки на сервер по сравнению с polling.
Недостатки SSE:
- Односторонняя связь: Клиент не может отправлять данные серверу через SSE.
- Ограниченная поддержка браузеров: Не поддерживается в Internet Explorer.
- Ограничения протокола: Только текстовые данные.
Когда использовать SSE:
- Уведомления: Например, уведомления о новых сообщениях.
- Обновления статуса: Например, статус заказа или задачи.
- Потоковая передача данных: Например, ленты новостей или обновления котировок.
Альтернативы SSE:
- WebSockets: Для двусторонней связи в реальном времени.
- Long Polling: Когда SSE недоступен.
- Polling: Для простых сценариев.
🚀 Источник: DeepSeek