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

Rust Edition mới nhất là gì?

Rust Edition mới nhất là gì? Rust dùng system gọi Editions để giới thiệu backward-incompatible changes một cách có kiểm soát. Edition mới nhất là bản 2024, tập trung vào…

Xem thêm
duckdb_featured_workspace

DuckDB là gì? Cơ sở dữ liệu phân tích hiệu năng cao cho developer

DuckDB là gì? Cơ sở dữ liệu phân tích hiệu năng cao cho developer DuckDB là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) dạng nhúng, được…

Xem thêm

gRPC là gì? Framework RPC hiệu năng cao cho microservice

gRPC là gì? Đây là framework gọi hàm từ xa (RPC) mã nguồn mở hiệu năng cao do Google phát triển, cho phép các dịch vụ phần mềm giao tiếp…

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