WebSockets vs SSE vs Socket.IO: Real-time web v praxi

Tri spôsoby, ako odosielať dáta zo servera na klienta v reálnom čase. Tu je popis, čo každý z nich robí, kde každý z nich sedí a ako bun.ws mení výkonový obraz pre WebSocket servery.

·3 min čítania

Live chat, kolaboratívne editovanie, dashboardy aktualizujúce sa bez obnovenia – všetky tieto potrebujú server, aby odosielal dáta klientovi. Existujú tri hlavné spôsoby, ako to urobiť, a nie sú zameniteľné.

Ako každý z nich funguje

Premýšľaj o normálnej webovej požiadavke ako o telefonickom hovore, kde hovoríš a potom zavesíš a čakáš, kým zavolá druhá osoba späť. To je HTTP. Real-time potrebuje niečo viac ako udržiavať linku otvorenú.

Server-Sent Events (SSE) udržiavajú pripojenie otvorené, takže server môže odosielať správy kedykoľvek chce. Klient nemôže posielať správy späť cez rovnaké pripojenie. Jednosmerné, server na klienta.

WebSockets sú plné obojsmerné pripojenie. Akonáhle je nadviazané, ktorákoľvek strana môže kedykoľvek poslať správu druhej s nízkou latenciou. To je to, čo chatové aplikácie, multiplayer hry a kolaboratívne nástroje používajú.

Socket.IO je knižnica postavená na vrchole WebSockets, ktorá pridáva auto-reconnection, miestnosti, pomenovanie udalostí a fallbacky.

Porovnanie vedľa seba

FunkciaSSEWebSocketsSocket.IO
SmerServer → Klient ibaObojsmernéObojsmerné
ProtokolHTTPWS/WSSVlastný (na vrchole WS)
Auto-reconnectZabudované v prehliadačiRučnéZabudované
Miestnosti/namespaceNieRučnéZabudované
Podpora prehliadačaVýbornáVýbornáVyžaduje klientsku lib
OverheadNízkyNízkyVyšší
Najlepšie preFeedy, notifikácieChat, hry, kolaboráciaKomplexný real-time

Kedy použiť SSE

SSE je podhodnotený. Ak tvoj prípad použitia je server-na-klienta iba – live activity feedy, aktualizácie pokroku, AI streamovacie odpovede, notifikácie – SSE je jednoduchší ako WebSockets a funguje so štandardným HTTP/2.

// Nitro / Nuxt serverová trasa
export default defineEventHandler(async (event) => {
  const stream = createEventStream(event)

  const interval = setInterval(async () => {
    await stream.push({ data: JSON.stringify({ time: Date.now() }) })
  }, 1000)

  stream.onClosed(() => clearInterval(interval))

  return stream.send()
})

Kedy použiť WebSockets

Čokoľvek obojsmerné: chat kde klient posiela správy, kolaboratívne editovanie kde viacero používateľov mení rovnaký dokument, multiplayer hry kde pozícia hráča tečie oboma smermi.

// Bun WebSocket server
const server = Bun.serve({
  port: 3000,
  websocket: {
    open(ws) { ws.subscribe('chat') },
    message(ws, message) { server.publish('chat', message) },
    close(ws) { ws.unsubscribe('chat') },
  },
  fetch(req, server) {
    if (server.upgrade(req)) return
    return new Response('Not a WebSocket request')
  },
})

bun.ws vs Node.js ekosystém

Ak prevádzkuješ WebSocket server na Bun, použij natívnu WebSocket podporu Bun.serve namiesto npm balíčka ws. Natívny bun.ws zvláda viac ako 200 000 správ za sekundu – niekoľkonásobne viac ako balíček ws pod Node.

Reconnection a spoľahlivosť

Browserové WebSocket pripojenia padajú keď sa menia siete. Obsluhuj to.

function connect() {
  const ws = new WebSocket('wss://example.com/ws')
  ws.onclose = () => setTimeout(connect, 1000 + Math.random() * 2000)
  return ws
}

Čo používať

SSE pre live feedy, AI streamovanie odpovedí, progress bary, notifikácie – čokoľvek server-na-klienta. Bez klientskej knižnice, funguje cez HTTP/2.

Natívne WebSockets s bun.ws pre chat, real-time kolaboráciu, multiplayer – čokoľvek obojsmerné kde záleží na priepustnosti.

Socket.IO zriedkavo v týchto dňoch. Užitočné keď potrebuješ miestnosti a namespace zo škatule, ale extra overhead a klientský bundle sú ťažšie na ospravedlnenie.