Ngu ngơ học làm web (97) - Stateless, stateful, connectionless

Tiếp theo của: Ngu ngơ học làm web (96) - Giao thức HTTP
-----

Phần 97. Stateless, stateful, connectionless


Hiểu nôm na, từ đầu đến giờ, để làm một ứng dụng web sẽ gồm hai phần:

- Lập trình front-end: dùng HTML để định hình cấu trúc của một trang web, dùng CSS để định dạng việc hiển thị, dùng JavaScript để xử lý các hành động tại phía client. Các đoạn mã này được trình duyệt biên dịch và thực thi tại máy client (client-side).

- Lập trình back-end: dùng PHP để thực hiện các xử lý tại server (server-side), thao tác với cơ sở dữ liệu.

Trong cùng một tập tin mã nguồn sẽ có những đoạn mã được xử lý tại server, có những đoạn mã được xử lý tại client. Có những dữ liệu được nhập và xử lý tại client, có những dữ liệu được nhập và xử lý tại server. Vậy sẽ có những tình huống cần chuyển dữ liệu giữa client-side qua server-side và ngược lại? Cơ chế nào để thực hiện việc này?

Nhiều lúc, nhìn trên mã nguồn thì thấy dữ liệu thuộc client-side ngay phía trên đó, mà chẳng thể lấy xuống để xử lý tại phần server-side được mà phải gửi qua/lại dựa trên hạ tầng mạng, đường đi xa, tốn thời gian.

Tới thời điểm này, đã biết hai phương thức được sử dụng để gửi dữ liệu qua/lại giữa client-side và server-side: đó là phương thức GET và POST của giao thức HTTP.

Đọc bài viết ngắn, rất hay này, liên quan đến vấn đề truyền dữ liệu giữa client-side và server-side, qua đó hiểu được khái niệm stateless và stateful: http://laptrinh.vn/d/3652-stateless-va-stateful-la-gi.html

Tóm tắt một số ý từ bài viết trên:

- Stateless là một kiểu thiết kế mà nó không lưu dữ liệu của client lên server, nghĩa là sau khi client gửi yêu cầu (request) lên server, server xử lý xong, trả về kết quả cho client. Sau đó mối quan hệ giữa client và server sẽ bị cắt đứt, server không lưu lại bất kì dữ liệu nào của client.

- Stateful là một kiểu thiết kế khác, mà nó có lưu dữ liệu của client lên server, nghĩa là sau mỗi request, vẫn còn duy trì ràng buộc giữa client và server. Dữ liệu lưu lại tại server có thể làm đầu vào (input parameters) cho lần xử lý kế tiếp, cho các xử lý nghiệp vụ khác.

HTTP là một giao thức dạng stateless.

Mà ứng dụng web lại dựa trên giao thức HTTP.

Trong một ứng dụng web, HTML được sử dụng để làm giao diện người dùng. Mà đã là một ứng dụng thì phải lấy được dữ liệu từ giao diện, xử lý, và xuất lại kết quả.

Các nhà làm ứng dụng web đã thiết kế bốn cách sau để gửi dữ liệu từ client (từ giao diện) lên server (phần xử lý), cả bốn cách đều có chung ý tưởng là lưu dữ liệu theo kiểu key/value:

- 1. Lưu trong các link (liên kết): sử dụng URL rewriter, HTML là ngôn ngữ định dạng tài liệu, nó không phải là ngôn ngữ lập trình nên không thể sử dụng các biến để lưu dữ liệu. Tuy nhiên, dữ liệu có thể được viết vào các link, và như thế khi người dùng bấm vào link thì dữ liệu sẽ được gửi lên server. Phần lớn dữ liệu được viết vào phần query của một URL, viết dưới dạng các cặp key=value (tên biến=giá trị). Một vài trường hợp có thể đưa dữ liệu vào phần path của URL hoặc ngay trong các biến của JavaScript. HTTP method được sử dụng ở đây là GET. GET là loại truy vấn cho phép đọc (read). Dữ liệu được lưu trong header của HTTP message.

- 2. Sử dụng các thành phần của form: hidden form, thay vì lưu dữ liệu vào đường link, sẽ lưu dữ liệu vào các thành phần của form và type của các thành phần này là hidden. Như vậy, mọi hành động của người dùng (action) sẽ gọi đến chức năng gửi form đó lên server (post), khi đó dữ liệu cần lưu ở lần trước đó sẽ được gửi lại. HTTP method được sử dụng ở đây là POST. POST là loại truy vấn cho phép ghi (write). Dữ liệu được lưu trong phần body của HTTP message.

- 3. Sử dụng cookie: trình duyệt cho phép mỗi web application lưu khoảng 4KB dữ liệu dưới dạng key/value. Như vậy, nếu lưu dữ liệu của lần truy vấn trước đó vào cookie thì giá trị này sẽ được gửi lên server trong mỗi request. Cookie là một phần trong header của HTTP message.

- 4. Sử dụng HTTP session: các web server cho phép mỗi client lưu một dung lượng nhỏ dữ liệu trên đó. Dữ liệu được lưu dưới dạng key/value và sẽ bị hủy (expire) nếu quá thời gian cho phép (timeout).

Connectionless

HTTP là giao thức phi kết nối (connectionless). Tuy nhiên lưu ý là: HTTP hoạt động dựa trên giao thức TCP/IP, mà TCP là giao thức hướng kết nối (oriented-connection).



Nghĩa là, HTTP client (trình duyệt) sẽ khởi tạo một HTTP request, gửi tới server, sau đó ngắt kết nối với server và chờ kết quả trả về từ server (chờ response). Phía server sẽ nhận request, xử lý request và thiết lập lại một kết nối khác tới client để gửi gói trả lời (response).
-----------
Cập nhật [7/2/2018][23/12/2016]
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web