Перейти к содержимому
Skip to content
← Все статьи

Server-Sent Events vs WebSockets: выбор технологии реального времени

Потребность в коммуникации реального времени

Традиционный HTTP работает по модели запрос-ответ: клиент спрашивает, сервер отвечает. Но современные веб-приложения требуют обновлений в реальном времени — live-дашборды, чат, уведомления, биржевые котировки, алерты мониторинг сайтов. Две технологии решают эту задачу: Server-Sent Events (SSE) и WebSockets. Выбор зависит от сценария использования.

Server-Sent Events (SSE)

SSE — простой протокол на основе HTTP для потоковой передачи обновлений от сервера к клиенту. Клиент открывает стандартное HTTP-соединение, сервер отправляет события по мере их возникновения. Соединение остаётся открытым, браузер автоматически переподключается при обрыве.

// Клиент: JavaScript EventSource API
const source = new EventSource('/api/events');

source.onmessage = (event) => {
    const data = JSON.parse(event.data);
    updateDashboard(data);
};

source.addEventListener('alert', (event) => {
    showNotification(JSON.parse(event.data));
});
// Сервер: PHP SSE endpoint
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no');

while (true) {
    $data = getLatestUpdates();
    if ($data) {
        echo "event: update\n";
        echo "data: " . json_encode($data) . "\n\n";
    }
    ob_flush();
    flush();
    sleep(1);
}

Особенности SSE:

WebSockets

WebSockets обеспечивают полнодуплексную коммуникацию по одному TCP-соединению. После HTTP upgrade handshake и клиент, и сервер могут отправлять сообщения в любое время. Протокол поддерживает текстовые и бинарные данные.

// Клиент: WebSocket API
const ws = new WebSocket('wss://example.com/ws');

ws.onopen = () => {
    ws.send(JSON.stringify({ type: 'subscribe', channel: 'alerts' }));
};

ws.onmessage = (event) => {
    const data = JSON.parse(event.data);
    handleMessage(data);
};

ws.onclose = () => {
    // Нужно ручное переподключение
    setTimeout(() => reconnect(), 3000);
};

Особенности WebSockets:

Сравнение

СвойствоSSEWebSockets
НаправлениеСервер → КлиентДвунаправленное
ПротоколHTTP/1.1, HTTP/2WS/WSS (upgrade из HTTP)
Формат данныхТекст (UTF-8)Текст + Бинарные
ПереподключениеАвтоматическоеРучное
Макс. соединений6 на домен (HTTP/1.1)Без HTTP-ограничений
Поддержка прокси/CDNОтличнаяТребует настройки
СложностьПростаяВыше
МасштабируемостьПроще (stateless HTTP)Сложнее (stateful соединения)

Когда использовать SSE

Когда использовать WebSockets

Производительность

Советы по реализации

Заключение

SSE и WebSockets решают разные задачи. SSE — правильный выбор для потоковой передачи от сервера к клиенту: проще, работает со стандартной HTTP-инфраструктурой, автоматически переподключается. WebSockets необходимы при двунаправленной коммуникации или передаче бинарных данных. Для большинства задач мониторинга и уведомлений SSE — прагматичный выбор. Используйте WebSockets когда двунаправленность — реальное требование, а не кажущееся.

Проверьте ваш сайт прямо сейчас

Проверить →
Другие статьи: HTTP
HTTP
Анализ серверных заголовков ответа: что они говорят о сайте
11.03.2026 · 15 просм.
HTTP
HTTP коды ответов: полный справочник с примерами
10.03.2025 · 34 просм.
HTTP
HTTP/2 vs HTTP/3: что нового и зачем переходить
14.03.2026 · 14 просм.
HTTP
HTTP-методы: GET, POST, PUT, DELETE и другие
16.03.2026 · 17 просм.