Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Чим WebSocket відрізняється від Server-Sent Events і коли що обирати?

Обидві технології дають змогу серверу надсилати дані в браузер без запиту від клієнта. Різниця - у напрямку, протоколі й складності.

Server-Sent Events (SSE) - однобічний потік від сервера до клієнта через звичайне HTTP-з'єднання:

const source = new EventSource('/orders/42/status');

source.addEventListener('status', (event) => {
  const { status } = JSON.parse(event.data);
  updateBadge(status);
});

source.onerror = () => { /* браузер сам перепідключиться */ };

Сервер відповідає з Content-Type: text/event-stream і пише рядки:

event: status
id: 17
data: {"status":"shipped"}

  • автоматичне перепідключення вбудоване; при перепідключенні браузер надсилає Last-Event-ID, і сервер може дослати пропущене;
  • працює через звичайний HTTP: проксі, балансувальники, автентифікація cookies - як у будь-якого запиту;
  • лише текст, лише від сервера;
  • на HTTP/1.1 браузер обмежує ~6 з'єднань на домен - кілька вкладок з SSE можуть їх вичерпати. На HTTP/2 і HTTP/3 обмеження немає.

WebSocket - двобічне постійне з'єднання з власним протоколом:

const socket = new WebSocket('wss://example.com/ws');
socket.onmessage = (event) => render(JSON.parse(event.data));
socket.send(JSON.stringify({ type: 'typing', chat: 7 }));
  • обидві сторони надсилають повідомлення будь-коли, з мінімальними накладними витратами;
  • текст і бінарні дані;
  • перепідключення, «серцебиття», підписки на канали - пишете самі або беруть бібліотеку;
  • потрібен сервер, що тримає тисячі постійних з'єднань, і налаштовані проксі.

Коли що:

Задача Вибір
статус замовлення, сповіщення, прогрес задачі, стрічка подій SSE
потокова відповідь LLM («друкується» по словах) SSE / потоковий fetch
чат, спільне редагування, ігри, присутність користувачів WebSocket
оновлення раз на хвилину звичайне опитування - найпростіше

У Laravel-екосистемі:

  • WebSocket - Laravel Reverb (свій сервер) чи Pusher, на клієнті Laravel Echo; трансляція подій через ShouldBroadcast;
  • SSE - response()->eventStream() у контролері; Livewire має wire:stream для потокового оновлення частини компонента.

Головна перевага SSE - простота: не потрібен окремий сервер і протокол, це звичайний маршрут Laravel. Але кожен відкритий потік тримає процес PHP-FPM зайнятим - під багато одночасних клієнтів потрібні Octane чи окремий сервіс.

Докладніше в документації: Server-Sent Events

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання