Thứ Năm, 17 tháng 9, 2009

Tìm hiểu Reverse AJAX


Tìm hiểu Reverse AJAX



Cùng với những kỹ thuật lập trình web mới ra đời, AJAX được xem là một ứng cử viên sáng giá trong việc nâng cao khả năng tương tác giữa website và người dùng. Giờ đây một kỹ thuật nữa lại ra đời Reverse AJAX, hứa hẹn sẽ cải thiện đáng kể hiệu suất của ứng dụng web tương tác hiện nay.

AJAX giúp nâng cao tính tương tác và thuận tiện giữa người dùng và ứng dụng web. Reverse Ajax còn làm nhiều hơn thế nữa, nó cho phép trang web có được dữ liệu thời gian thực, giúp giảm lượng request từ client đến server để kiểm tra dữ liệu mới.

Trước khi đi vào phần chi tiết, bạn nên tìm hiểu một chút về AJAX

Tại sao có Reverse AJAX, vấn đề đang gặp phải là gì?

Trước hết ta cần biết về nguyên tắc làm việc của ứng dụng web - giao thức HTTP, nó theo cơ chế: Request - Response. Trước tiên client sẽ gởi request lên server yêu cầu một nguồn tài nguyên nào đó; server sẽ tiếp nhận, xử lý và trả kết quả về (response); lúc đó kết nối hai bên bị ngắt. Server hoàn toàn KHÔNG THỀ chủ động liên lạc với client được, hay nói cách khác nếu server có một thông tin gì đó cần gởi cho client, nó không thể làm được. Nó chỉ có thể gởi cho client nếu như client kích khởi một yêu cầu mới.

Với AJAX ta có thể làm cho quá trình này trong suốt hơn với người dùng - hãy hình dung một chương trình chat - sẽ cấu hình cho client định kỳ gởi request lên server để lấy dữ liệu. Nhưng làm như thế sẽ rất tốn tài nguyên (không thể áp dụng cho hệ thống nhiều user truy cập) vì không phải lúc nào request lên cũng có dữ liệu mới, và không cập nhật tức thời (độ trể (legacy) cao - mỗi lần gởi request lên server phải tạo connection mới).
Thật sự thì Reverse AJAX không thay đổi được cơ chế Request - Response hiện tại của giao thức HTTP. Nó chỉ đơn giản là những mẹo (trick) để giải quyết một vấn đề đang gặp phải.

Reverse AJAX là gì?

Cũng như các kỹ thuật khác như AJAX, Reverse AJAX không phải là cái gì đó mới mẻ, nó là một tập hợp của những kỹ thuật hiện có để Push dữ liệu, ứng dụng các kỹ thuật này vào AJAX ta có Reverse AJAX. Thuật ngữ này được DWR - một thư viện mã nguồn mở của Java đưa ra. Một số thuật ngữ khác như AJAX Push, Two-way-web, HTTP Streaming, HTTP server push đều hàm ý chỉ phương pháp này.
Reverse AJAX cho phép server đẩy dữ liệu về phía client ngay khi cần thiết
Sau đây là mô tả về ba kỹ thuật được sử dụng để giải quyết vấn đề làm cách nào để server push dữ liệu về client

Polling

Hình dung bạn cùng gia đình đi chơi cuối tuần, chở baby theo. Baby cứ ngồi trên xe hỏi liện tục "Tới chưa ba, tới chưa ba", bạn sẽ trả lời là "Chưa tới", và sau đó là "Tới rồi" (đừng trả lời là "Mệt quá hỏi quài nha" - lúc đó là server đang treo đó). Vợ bạn thì ngủ trên xe, tới nơi bạn kêu "Dậy đi má nó " lúc đó vợ bạn thức dậy.


Polling là kỹ thuật định kỳ gởi request lên server hỏi xem có dữ liệu mới không. Như đã nói ở trên, đây là cách cực kỳ tốn kém tài nguyên vì không phải lần request nào cũng có dữ liệu mới và không hiệu quả vì nó gây ra hiệu ứng giống như đang bị DOS


Comet, long lived Http, the slow load technique



Tất cả đều chỉ chung một kỹ thuật. Kỹ thuật này đòi hỏi có một kết nối thường trực giữa server và client. Khi client bắt đầu yêu cầu trang web, server sẽ trả lời một các cực kỳ chậm nhằm duy trì một kết nối càng lâu càng tốt với client.

Nếu vậy chẳng lẻ request lên xong server trả lời từ từ hoài? Vậy làm sao có được nội dung cần thiết? Chắc chắn không có ai làm như thế, chúng ta sẽ dùng một cách khác là sử dụng iframe (inline frame). Trang web sẽ được lồng vào một iframe ẩn, nội dung web vẫn bình thường, chỉ có nội dung iframe là được trả lời càng chậm càng tốt.


Bằng cách này user sẽ có trang nội dung bình thường cộng thêm một kết nối luôn luôn mở. Như vậy với kết nối này server có thể gởi dữ liệu về client, sau đó sẽ được javascript xử lý hiển thị cho người dùng xem. Các hàm sự kiện javascript sẽ cho ta biết lúc nào có dữ liệu mới được server đưa về



Piggyback



Khái niệm này - Piggy-backing - có thể hiểu như bạn làm một việc gì đó mà việc đó dựa vào một việc khác.
Có nghĩa là server sẽ gởi thông tin về client cùng lúc với request của client cho một dữ liệu khác. Khi có thông tin cần gởi cho client, server sẽ lưu lại chờ lần request tiếp theo của client sẽ gởi kèm theo.

Ví dụ tôi muốn thông báo cho bạn A hôm nay nghỉ học nhưng không biết làm sao để thông báo. Tự nhiên bạn A đến nhà tôi hỏi bài, tôi liền nói bạn là hôm nay nghỉ học. Dự định bạn A đến nhà tôi không phải để biết thông tin có đi học không, nhưng ngoài thông tin bạn cần tôi gởi thêm thông tin nghỉ học nữa.


Kết luận

Reverse AJAX không phải là một kỹ thuật mới, và nó cũng không giúp giải quyết được dứt điểm vấn đề. Tuy nhiên việc áp dụng nó sẽ giúp LTV giảm độ trể (legacy) của thông tin cần truyền cho client. Polling và Piggyback là những kỹ thuật được dùng phổ biến lâu nay. Comet là kỹ thuật tốt để giải quyết vấn đề, tuy nhiên việc phải duy trì một never-closed connection cho từng client cũng không phải là chuyện đơn giản đối với ứng dụng đa người dùng.


Socket là giải pháp tốt để giúp truyền dữ liệu từ server về client, chỉ tiếc là socket không thề hoạt động hoàn hảo trên nền web do bị vướng firewall, ...

Các công nghệ mới như Flex, Siverlight có những cách giải quyết của riêng nó, bạn nên tham khảo qua để biết.

Không có nhận xét nào:

Đăng nhận xét