Skip to content

Realtime Communication (Polling / SSE / WebSocket) ​

Mở đầu

Browser thực hiện realtime data update thế nào? HTTP truyền thống dựa trên "request-response", client phải chủ động request mới có data. Cho chatroom, stock feed realtime, model này gặp thách thức.

Chương này giới thiệu 3 tech FE cho realtime communication: short polling, SSE (Server-Sent Events), WebSocket full-duplex.


1. Limit của HTTP truyền thống ​

HTTP thiết kế ban đầu để retrieve document, stateless + client unidirectional:

  1. Client gửi HTTP request
  2. Server xử + return response
  3. Connection xong release (HTTP/1.1 có keep-alive nhưng business request-response model không đổi)

Trong model này, server không thể chủ động notify client khi state đổi. Cần architecture khác.


2. Short Polling ​

Solution trực tiếp nhất. Client dùng timer (vd setInterval), mỗi vài giây tự gửi HTTP request hỏi server có data mới không.

Đặc điểm + giới hạn:

  • Ưu: cực đơn giản, chỉ cần HTTP standard + AJAX/Fetch
  • Nhược: network overhead lớn + lãng phí. Đa số thời gian server trả "không có". Mỗi request kèm full HTTP header (Headers, Cookies), concurrency cao = network bị chiếm bởi query vô nghĩa

3. Server-Sent Events (SSE) ​

Để giảm overhead lập HTTP connection liên tục, SSE = single-direction data stream lightweight.

SSE build trên HTTP. Client gửi HTTP request có header đặc biệt (Accept: text/event-stream), server return response giữ TCP connection mở. Sau đó server push text data liên tục.

Đặc điểm:

  • Ưu: persistent connection, overhead thấp; browser native support auto reconnect; rất hợp unidirectional server → client streaming (LLM output từng chữ, realtime trade feed)
  • Nhược: channel 1 chiều. Client muốn gửi command/data mới phải lập HTTP request riêng

4. WebSocket: full-duplex protocol ​

Khi cần high-frequency bidirectional (multi-player game, collaborative doc editing), cần tech vừa giảm overhead vừa true full-duplex — WebSocket.

WebSocket là protocol network độc lập. Khéo léo dùng HTTP để init:

  1. Handshake: client gửi HTTP request đặc biệt với Upgrade: websocket header
  2. Connection upgrade: server support → reply 101 Switching Protocols
  3. Tự do hoàn toàn: HTTP xong, TCP connection giao cho WebSocket. Client + server equal full-duplex, gửi-nhận data frame minimal

Đặc điểm:

  • Ưu: true bidirectional realtime; data frame header rất nhỏ, latency thấp, throughput cao; native binary support (ArrayBuffer)
  • Nhược: complexity cao; maintain persistent connection → yêu cầu architecture server + load balancing + heartbeat strict hơn

5. Tổng kết: tech selection ​

DimPollingSSEWebSocket
DirectionClient pull (1-chiều)Server push (1-chiều)2-chiều equal (full-duplex)
UnderlyingHTTP standardHTTP standardWebSocket protocol riêng (trên TCP)
Data overheadCực cao (full HTTP header)ThấpCực thấp (data frame minimal header)
Use caseCheck async task status định kỳLLM streaming, news/notification pushRealtime voice/video signaling, multiplayer, collaborative whiteboard

Engineer chọn dựa trên yêu cầu realtime + frequency bidirectional, cân bằng maintenance complexity + communication efficiency.

2026 cho VN dev

  • AI streaming: GPT, Claude, Gemini API đều dùng SSE cho streaming response
  • WebSocket libs: Socket.IO (popular, fallback), ws (Node), Phoenix Channels (Elixir)
  • Realtime BaaS: Supabase Realtime, Firebase, Ably, Pusher
  • WebRTC: voice/video call peer-to-peer, dùng cho call center
  • Long polling deprecated: dùng SSE thay cho 90% scenario
  • VN use case: live chat hỗ trợ (Tawk, Crisp), real-time notification (Zalo OA)
  • HTTP/3 + QUIC: SSE chạy tốt hơn trên HTTP/3, mobile mượt