Insights

Đừng lạm dụng WebSocket: Khi nào SSE mới là lựa chọn đúng

WebSocket không phải cách duy nhất để làm real-time. Server-Sent Events (SSE) nhẹ hơn, đơn giản hơn, và thường là lựa chọn tốt hơn—nhưng đa số dev không biết nó tồn tại.

Duy Pham

Mobile App Developer

Jan 5, 20260 phút đọc224 lượt xem
Đừng lạm dụng WebSocket: Khi nào SSE mới là lựa chọn đúng

Tính năng real-time giờ ở khắp nơi. Notification. Bảng giá chứng khoán. Activity feed. Và mỗi khi nhắc tới "real-time," hầu hết dev nghĩ ngay tới WebSocket.

Nhưng thật ra WebSocket có thể là quá đà cho thứ bạn đang làm.

Có một lựa chọn khác đang nằm ngay trước mắt—Server-Sent Events (SSE). Nó là chuẩn có sẵn của trình duyệt, chạy trên HTTP bình thường, và xử lý hầu hết các bài toán real-time một chiều tốt hơn WebSocket.

Vậy sao không ai dùng? Đơn giản: họ không biết nó tồn tại, hoặc nghĩ nó "lởm."

Cái giá của WebSocket

WebSocket mạnh. Nó cho bạn kênh hai chiều, full-duplex. Nhưng sức mạnh đó đi kèm gánh nặng:

Tốn tài nguyên. WebSocket là stateful. Mỗi kết nối chiếm tài nguyên server. Scale lên triệu kết nối? Đắt đỏ.

Load balancing đau đầu. Kết nối bị "dính" vào server cụ thể. Scale ngang trở thành bài toán phức tạp thay vì chỉ thêm vài config.

Reconnect? Tự xử. Khi mất kết nối (và chắc chắn sẽ mất), bạn phải tự code logic reconnect. Socket.io giúp được, nhưng nó nặng.

Hai chiều trong khi chỉ cần một chiều. Server chỉ cần đẩy data về client—notification, update, feed—sao phải giữ kênh hai chiều?

SSE là gì?

Server-Sent Events đơn giản đến bất ngờ. Nó chỉ là HTTP request với Content-Type: text/event-stream và response body không bao giờ kết thúc.

Hình dung như một trang web load mãi không xong. Server giữ kết nối và gửi data mỗi khi có gì mới.

Hết. Không upgrade protocol. Không handshake đặc biệt. Chỉ là HTTP làm việc của HTTP.

SSE thắng ở đâu?

Implement cực đơn giản. Vài dòng code hai đầu. API EventSource của trình duyệt lo hết.

Chạy trên HTTP thuần. Load balancer, proxy, firewall—tất cả coi SSE như web traffic bình thường. Không cần config đặc biệt.

Auto-reconnect có sẵn. Rớt mạng? Trình duyệt tự nối lại và gửi Last-Event-ID để server tiếp tục từ chỗ cũ. Bạn được free tính năng này.

Nhiều stream trên một kết nối. HTTP/2 cho phép chạy nhiều SSE stream trên cùng một connection. WebSocket thường cần mỗi channel một connection.

Thân thiện với hạ tầng. Tooling HTTP có sẵn hoạt động bình thường. Monitoring, logging, caching—tất cả những gì bạn đã setup.

Khi nào dùng gì?

Chọn SSE khi:

  • Server đẩy data về client (một chiều)
  • Notification, live feed, bảng giá, progress update
  • Bạn muốn đơn giản hơn phức tạp
  • Hạ tầng đang chạy HTTP

Chọn WebSocket khi:

  • Cần giao tiếp hai chiều thực sự
  • Game real-time, collaborative editing, chat với typing indicator
  • Latency dưới mili-giây quan trọng
  • Cần stream binary data

Kết

Đừng mặc định chọn WebSocket. Hỏi bản thân: client có thực sự cần gửi data real-time về server không?

Nếu không, SSE có lẽ là thứ bạn cần. Nhẹ hơn, đơn giản hơn, và được thiết kế đúng cho use case này.

Đôi khi giải pháp "nhàm chán" mới là giải pháp đúng.

Thẻ

#real-time
#websocket
#sse
#server-sent-events
#web-development
#performance
#architecture

Bài Viết Có Ích?

Thêm bài viết về lập trình AI và mobile