Short Polling vs Long Polling
1. Short Polling
Short polling là một kỹ thuật trong đó client (ví dụ: ứng dụng hoặc trình duyệt) liên tục gửi yêu cầu đến server để kiểm tra xem có dữ liệu mới hay không. Server sẽ trả lời ngay lập tức, bất kể có dữ liệu mới hay không.
Cách hoạt động:
Client gửi yêu cầu (request) đến server theo khoảng thời gian cố định (ví dụ: cứ mỗi 1 giây).
Server trả lời ngay lập tức với dữ liệu (nếu có) hoặc thông báo "không có gì mới" (thường là một phản hồi rỗng).
Client nhận phản hồi và lặp lại quá trình này.
Ưu điểm:
Đơn giản để triển khai.
Phù hợp với các ứng dụng không cần cập nhật dữ liệu quá thường xuyên.
Nhược điểm:
Tốn tài nguyên: Client gửi nhiều yêu cầu không cần thiết ngay cả khi không có dữ liệu mới.
Có thể gây độ trễ nhỏ nếu dữ liệu mới xuất hiện ngay sau khi client vừa nhận phản hồi.
Ví dụ thực tế:
Một ứng dụng kiểm tra email cũ, cứ mỗi 30 giây hỏi server "Có email mới không?".
2. Long Polling
Long polling là một kỹ thuật cải tiến, trong đó client gửi yêu cầu đến server, nhưng server không trả lời ngay lập tức nếu không có dữ liệu mới. Thay vào đó, server giữ kết nối mở cho đến khi có dữ liệu hoặc hết thời gian chờ (timeout).
Cách hoạt động:
Client gửi một yêu cầu đến server.
Nếu server có dữ liệu mới, nó trả lời ngay lập tức.
Nếu không có dữ liệu, server giữ yêu cầu "treo" (open) cho đến khi có dữ liệu mới hoặc hết thời gian chờ.
Khi client nhận được phản hồi, nó gửi một yêu cầu mới để tiếp tục quá trình.
Ưu điểm:
Hiệu quả hơn short polling vì giảm số lượng yêu cầu không cần thiết.
Cung cấp cập nhật gần như tức thời khi có dữ liệu mới.
Nhược điểm:
Phức tạp hơn để triển khai.
Server phải quản lý nhiều kết nối đang mở, có thể gây tải nặng nếu có nhiều client cùng lúc.
Ví dụ thực tế:
Ứng dụng chat như WhatsApp hoặc Messenger, nơi server giữ kết nối để gửi tin nhắn mới ngay khi có.
So sánh Short Polling và Long Polling
Tần suất yêu cầu
Liên tục, định kỳ
Chỉ khi nhận phản hồi hoặc timeout
Độ trễ dữ liệu
Có thể trễ một khoảng nhỏ
Gần như tức thời
Tài nguyên
Tốn nhiều (nhiều yêu cầu)
Tốn ít hơn (ít yêu cầu hơn)
Độ phức tạp
Đơn giản
Phức tạp hơn
Ứng dụng
Kiểm tra định kỳ đơn giản
Cập nhật thời gian thực
Khi nào dùng cái nào?
Short polling: Dùng cho các ứng dụng không cần cập nhật ngay lập tức, ví dụ như kiểm tra trạng thái hệ thống mỗi vài phút.
Long polling: Dùng cho các ứng dụng cần phản hồi nhanh, như chat, thông báo trực tiếp.
Long Polling chi tiết
Long polling là một kỹ thuật giao tiếp client-server dựa trên giao thức HTTP, được thiết kế để mô phỏng cập nhật thời gian thực (real-time) mà không cần gửi yêu cầu liên tục như short polling. Nó tận dụng khả năng giữ kết nối HTTP mở (HTTP persistent connection) để đạt được hiệu quả cao hơn.
Cách hoạt động cụ thể
Client gửi yêu cầu: Client (thường là trình duyệt hoặc ứng dụng) gửi một yêu cầu HTTP (thường là GET) đến server.
Server xử lý:
Nếu có dữ liệu mới (ví dụ: tin nhắn, thông báo), server trả lời ngay lập tức với dữ liệu đó.
Nếu không có dữ liệu mới, server không trả lời ngay mà giữ kết nối mở (trạng thái "pending" hoặc "hanging"), chờ cho đến khi có sự kiện mới xảy ra.
Thời gian chờ (timeout):
Server thường đặt một giới hạn thời gian (timeout, ví dụ: 30 giây). Nếu hết thời gian mà không có dữ liệu, server trả về một phản hồi rỗng (hoặc mã trạng thái đặc biệt) để kết thúc kết nối.
Client phản hồi:
Khi nhận được dữ liệu (hoặc phản hồi rỗng), client xử lý thông tin và ngay lập tức gửi một yêu cầu long polling mới để tiếp tục lắng nghe.
Ví dụ thực tế
Ứng dụng chat: Khi bạn đang trò chuyện trên một ứng dụng web, client gửi yêu cầu long polling đến server. Server giữ kết nối mở và chỉ trả lời khi có tin nhắn mới từ người khác gửi đến bạn.
Thông báo trực tuyến: Một hệ thống như bảng điều khiển quản trị viên (admin dashboard) có thể dùng long polling để hiển thị thông báo ngay khi có sự kiện mới (ví dụ: đơn hàng mới).
Ưu điểm chi tiết
Giảm tải mạng:
Không giống short polling, long polling không tạo ra hàng loạt yêu cầu vô ích khi không có dữ liệu mới. Điều này giảm băng thông và tài nguyên CPU trên cả client và server.
Cập nhật gần thời gian thực:
Dữ liệu được gửi đến client ngay khi nó có sẵn, thay vì chờ đến lần kiểm tra tiếp theo như short polling.
Tương thích với HTTP:
Long polling hoạt động tốt trong môi trường web truyền thống mà không cần giao thức đặc biệt như WebSocket.
Nhược điểm chi tiết
Quản lý kết nối phức tạp:
Server phải giữ nhiều kết nối HTTP mở đồng thời, đặc biệt nếu có hàng nghìn client. Điều này có thể tiêu tốn bộ nhớ và tài nguyên server.
Timeout và reconnect:
Nếu kết nối bị ngắt do timeout hoặc lỗi mạng, client phải tự động gửi lại yêu cầu. Điều này đòi hỏi cơ chế xử lý lỗi tốt ở phía client.
Không tối ưu cho quy mô lớn:
Với số lượng client lớn, long polling có thể không hiệu quả bằng các giải pháp như WebSocket hoặc Server-Sent Events (SSE), vì mỗi kết nối mở đều chiếm một luồng (thread) hoặc tài nguyên trên server.
Long Polling trong Java: Cách hoạt động
Trong Java, long polling thường được triển khai bằng cách:
Client gửi yêu cầu HTTP: Thường là một yêu cầu GET đến một endpoint trên server.
Server giữ kết nối mở: Server không trả lời ngay mà chờ dữ liệu mới (hoặc timeout).
Server trả lời: Khi có dữ liệu mới hoặc hết thời gian chờ, server gửi phản hồi và đóng kết nối.
Client gửi lại yêu cầu: Sau khi nhận phản hồi, client gửi một yêu cầu long polling mới.
Java Servlet hỗ trợ cơ chế này thông qua asynchronous processing (xử lý không đồng bộ), được giới thiệu từ Servlet 3.0, giúp tránh chặn luồng (thread) trong khi giữ kết nối mở.
Triển khai với Spring Boot
Nếu bạn dùng Spring Boot, việc triển khai long polling sẽ dễ hơn nhờ các tính năng như @Async và DeferredResult. Dưới đây là một ví dụ:
Server-side (Spring Boot)
Giải thích
DeferredResult: Một lớp trong Spring cho phép trả về kết quả không đồng bộ. Server giữ yêu cầu mở cho đến khi setResult được gọi.
onTimeout: Xử lý khi hết thời gian chờ (30 giây), gửi phản hồi rỗng.
sendUpdate: Gửi dữ liệu đến tất cả client đang chờ và hoàn thành yêu cầu.
Một số lưu ý khi triển khai trong Java
Quản lý tài nguyên:
Với nhiều client, số lượng kết nối mở có thể tăng nhanh. Hãy cân nhắc giới hạn số lượng client hoặc dùng hàng đợi (queue) để xử lý dữ liệu.
Thread pool:
Servlet không đồng bộ và DeferredResult sử dụng thread pool của container (như Tomcat). Đảm bảo cấu hình thread pool đủ lớn (ví dụ: trong application.properties của Spring Boot: server.tomcat.threads.max=200).
Thay thế giả lập:
Trong thực tế, thay vì dùng Thread.sleep để giả lập, bạn nên tích hợp với hệ thống sự kiện (như Spring Event hoặc một message broker như RabbitMQ/Kafka).
Last updated