WebSocket là gì? Hướng dẫn chi tiết cho lập trình viên

WebSocket là gì là câu hỏi cơ bản mà bất kỳ lập trình viên web nào cũng cần nắm rõ. WebSocket là giao thức truyền dữ liệu hai chiều theo thời gian thực, cho phép server và client giao tiếp liên tục qua một kết nối TCP duy nhất. Khác với HTTP thông thường chỉ gửi request rồi nhận response một lần, WebSocket giữ kết nối mở để hai bên đẩy dữ liệu cho nhau bất cứ lúc nào.

Giao thức WebSocket

WebSocket hoạt động như thế nào?

WebSocket bắt đầu bằng một HTTP request thông thường với header Upgrade: websocket để thực hiện bắt tay (handshake). Sau khi server đồng ý với response HTTP 101, kết nối được nâng cấp thành cấu hình full-duplex, cho phép cả hai bên gửi tin nhắn qua lại mà không cần tạo kết nối mới cho mỗi lần trao đổi.

Theo chuẩn WHATWG, giao thức này được thiết kế cho các ứng dụng cần giao tiếp theo thời gian thực, giảm overhead so với việc polling HTTP nhiều lần.

Lợi ích so với HTTP polling

Tiêu chí HTTP Polling WebSocket
Độ trễ Cao, phụ thuộc tần suất poll Thấp, tin nhắn đẩy tức thì
Băng thông Lãng phí qua header HTTP Tiết kiệm, chỉ dữ liệu
Server push Phải poll thì mới có Server tự đẩy dữ liệu
Kết nối Mở/đóng liên tục Giữ kết nối lâu dài

Đây chính là lý do WebSocket phù hợp với ứng dụng chat, game online, bảng giá chứng khoán và hệ thống thông báo thời gian thực.

Cách dùng WebSocket trong JavaScript

Sử dụng WebSocket API chuẩn của trình duyệt rất đơn giản, được mô tả đầy đủ trong tài liệu MDN:

Đầu tiên tạo một kết nối:

const ws = new WebSocket('wss://example.com/socket');

Lắng nghe sự kiện khi server đẩy dữ liệu đến:

ws.onmessage = (event) => { console.log(event.data); };

Gửi dữ liệu tới server:

ws.send(JSON.stringify({ type: 'message', data: 'Xin chào' }));

Đóng kết nối khi không cần:

ws.close();

WebSocket với Python (websockets)

Ở phía server, Python cung cấp thư viện websockets để triển khai server Echo đơn giản:

import asyncio; from websockets import serve

async def handle(websocket): async for message in websocket: await websocket.send(message)

async def main(): async with serve(handle, "localhost", 8765): await asyncio.Future()

asyncio.run(main())

Chạy script trên và bạn đã có một WebSocket server cơ bản nhận đổi dữ liệu.

Các thư viện và framework phổ biến

  • Socket.IO: Thư viện JavaScript phổ biến nhất, kèm fallback sang HTTP khi trình duyệt không hỗ trợ WebSocket
  • ws: Thư viện Node.js nhẹ, hiệu suất cao cho WebSocket thuần
  • WebSocket API: Tiêu chuẩn trình duyệt tích hợp sẵn
  • FastAPI / Flask-SocketIO: Hỗ trợ WebSocket trong backend Python

Khi nào nên dùng WebSocket?

Nên chọn WebSocket khi:

  • Ứng dụng cần cập nhật thời gian thực liên tục
  • Cần server chủ động đẩy dữ liệu đến client
  • Chi phí băng thông là mối quan tâm chính
  • Số lượng kết nối đồng thời cao nhưng mỗi kết nối ít tin nhắn

Nên tránh khi chỉ cần thao tác request-response đơn giản, sử dụng REST API sẽ đơn giản và an toàn hơn nhiều.

Server-Sent Events: Giải pháp thay thế

Nếu bạn chỉ cần server gửi dữ liệu đến client (one-way communication) mà không cần client đẩy lại, Server-Sent Events (SSE) đơn giản hơn WebSocket nhiều. SSE dùng HTTP thông thường, dễ cài đặt hơn, và có khả năng tự reconnect khi mất kết nối. Tuy nhiên, SSE không phù hợp với các trường hợp cần hai chiều dữ liệu liên tục như chat hay multiplayer game.

Hiệu năng và scalability

WebSocket tiết kiệm băng thông đáng kể so với HTTP long-polling, nhưng mỗi kết nối WebSocket giữ một TCP socket mở trên server. Với số lượng kết nối đồng thời lớn (hàng nghìn trở lên), bạn cần cân nhắc kiến trúc server phù hợp. Socket.IO hỗ trợ scaling theo chiều ngang với Redis adapter, trong khi giải pháp thuần WebSocket cần load balancer hỗ trợ sticky session.

Một vấn đề phổ biến là WebSocket không thể cache được như HTTP request thông thường. Điều này có nghĩa mọi dữ liệu phải được xử lý real-time hoặc kết hợp caching ở layer application thay vì CDN.

Bảo mật WebSocket

Luôn dùng giao thức mã hóa wss:// thay vì ws:// khi kết nối qua internet để chống nghe lén dữ liệu. Validate dữ liệu trên server và áp dụng rate-limiting để chống tấn công flood. Kiểm tra header Origin để tránh CSRF qua WebSocket, và sử dụng token xác thực (JWT) trong quá trình bắt tay hoặc trong mỗi tin nhắn.

Kết luận

WebSocket là công cụ mạnh mẽ cho ứng dụng thời gian thực. Kết hợp với các framework hiện đại, nó trở thành tiêu chuẩn cho chat, game, dashboard và ứng dụng cần giao tiếp liên tục. Hiểu rõ khi nào nên và không nên WebSocket giúp bạn thiết kế hệ thống hiệu quả hơn nhiều.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Kotlin vs Swift: So sánh hai ngôn ngữ phát triển mobile

Kotlin và Swift: Hai ngôn ngữ phát triển mobile Kotlin và Swift là hai ngôn ngữ lập trình quan trọng nhất trong phát triển ứng dụng di động hiện nay….

Xem thêm

Message Queue là gì? So sánh RabbitMQ và Kafka cho người mới

Message Queue là hàng đợi tin nhắn, một hình thức giao tiếp bất đồng bộ giữa các dịch vụ trong kiến trúc microservices và serverless. Tin nhắn được lưu trên…

Xem thêm

Microservices là gì? Kiến trúc microservices cho người mới

Microservices là một phong cách kiến trúc phần mềm phát triển một ứng dụng thành tập hợp các dịch vụ nhỏ, độc lập, mỗi dịch vụ chạy trong tiến trình…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất