DDevArchive
Đăng nhập

Real-time: WebSocket & SSE — chat, notification, live dashboard

HTTP request-response chỉ 1 chiều: client hỏi, server trả lời. Nhưng chat, notification, live price — cần server GỬI TỚI CLIENT bất kỳ lúc nào. WebSocket và SSE giải quyết điều này.

WebSocket vs SSE: chọn cái nào?

Tiêu chíWebSocketSSE (Server-Sent Events)
Hướng giao tiếpHai chiều (client ↔ server)Một chiều (server → client)
Phức tạpCao hơnĐơn giản hơn
ReconnectTự implementTự động reconnect
Use caseChat, game, real-time collabNotification, live feed, dashboard
Khi nào dùngCần gửi data từ client lên thường xuyênChỉ cần server push xuống client

SSE: đơn giản nhất cho notification & live feed

// File: sse-server.ts
// Server: gửi event stream
app.get("/api/events", (req, res) => {
  res.setHeader("Content-Type", "text/event-stream")
  res.setHeader("Cache-Control", "no-cache")
  res.setHeader("Connection", "keep-alive")

  // Gửi event mỗi 5 giây
  const interval = setInterval(() => {
    const data = JSON.stringify({
      type: "notification",
      message: "Có đơn hàng mới!",
      time: new Date().toISOString(),
    })
    res.write(`data: ${data}

`)
  }, 5000)

  req.on("close", () => clearInterval(interval))
})
// File: sse-client.ts
// Client: nhận event stream
const source = new EventSource("/api/events")

source.onmessage = (event) => {
  const data = JSON.parse(event.data)
  showNotification(data.message)
}

source.onerror = () => {
  // Tự động reconnect — SSE handle sẵn
  console.log("Reconnecting...")
}

WebSocket: khi cần 2 chiều (chat)

// File: ws-server.ts
import { WebSocketServer } from 'ws'

const wss = new WebSocketServer({ port: 8080 })

wss.on("connection", (ws) => {
  ws.on("message", (message) => {
    // Broadcast cho tất cả client khác
    wss.clients.forEach((client) => {
      if (client !== ws && client.readyState === 1) {
        client.send(message.toString())
      }
    })
  })
})
💡 Cho MVP: dùng SSE trước

SSE đơn giản hơn WebSocket rất nhiều. Notification, live dashboard, order tracking — SSE đủ. Chỉ dùng WebSocket khi thật sự cần 2 chiều (chat, collab editing).

❓ Khi nào nên dùng SSE thay vì WebSocket?

  • Triển khai SSE endpoint cơ bản
  • Kết nối EventSource từ client
  • Biết khi nào SSE vs WebSocket
  • Xử lý connection cleanup