Stateless và Stateful là gì?

Bài viết được sự cho phép của tác giả Tino Phạm

Stateless là design không lưu dữ liệu của client trên server. Có nghĩa là sau khi client gửi dữ liệu lên server, server thực thi xong, trả kết quả thì “quan hệ” giữa client và server bị “cắt đứt” – server không lưu bất cứ dữ liệu gì của client.

  HTTP status code là gì? Danh sách đầy đủ HTTP status code
  Kiểm thử tĩnh vs kiểm thử động (Static vs Dynamic testing)

Stateful là một design ngược với stateless, server cần lưu dữ liệu của client, điều đó đồng nghĩa với việc ràng buộc giữa client và server vẫn được giữ sau mỗi request (yêu cầu) của client. Data được lưu lại phía server có thể làm đầu vào (input parameters) cho lần kế tiếp, hoặc là dữ kiện dùng trong quá trình xử lý hay phục vụ cho bất cứ nhu cầu nào phụ thuộc vào bussiness (nghiệp vụ) cài đặt.

Hai mô hình tương tác cơ bản của thiết kế client-server là cơ sở để hình thành nên các application protocol, framework, technology,… Ví dụ, HTTP là một Application Protocol (giao thức ứng dụng) dạng stateless, nghĩa là tương tác client-server theo HTTP thì phần server sẽ không lưu lại dữ liệu của client.
HTTP ban đầu được dùng cho web, đơn thuần chỉ là Web Site. Phần client gửi request (yêu cầu) truy vấn tới các Web Page (trang web – là các trang HTML), server nhận yêu cầu, đáp trả nội dung của Web Page và sau đó cắt đứt mọi liên hệ với client (không lưu data của client).

Khi sự đơn giản của Web Site hấp dẫn nhà phát triển phần mềm, người ta nảy sinh ý tưởng xây dựng phần mềm dưới dạng web. Nghĩa là HTML dùng vào làm User Interface (giao diện người dùng) cho một application (ứng dụng phần mềm) và phần mềm được thiết kế dưới dạng client-server, khi đó HTTP đóng vai trò protocol cho tương tác chủ – khách. Nhưng phần mềm viết ra để xử lý dữ liệu của người dùng, nghĩa là trong rất nhiều tương tác, server cần phải lưu data hoặc kết quả trả về làm đầu vào cho lần xử lý kế tiếp, đặc biệt những nghiệp vụ được đặt trong transaction. Như vậy, về căn bản HTTP không đáp ứng được sự phức tạp trong yêu cầu phát triển phần mềm.

Tuy nhiên, người ta có nhiều mánh khóe để khắc phục yếu điểm đó. Dù là một stateless design nhưng nếu kết hợp với HTML chúng ta vẫn có thể biến một Web Site làm được những gì tương tự như stateful. Có 4 cách lưu data của client khi xây dựng Web Application.

  1. 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 (liên kết) và như thế khi người dùng click 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 dưới các cặp parameters gồm key=value (cặp khóa/giá trị), một vài cài đặt có thể đưa dữ liệu vào phần path hay trong các biến của javascript,…
  2. Hidden Form: Thay vì lưu dữ liệu vào đường link, ta sẽ lưu dữ liệu vào các thành phần của form và type (kiểu) của các element này là hidden – ẩn. Như vậy, mọi action (hành xử) của người dùng sẽ gọi đến hành động post (gửi) form đó lên server và như thế dữ liệu cần lưu ở lần trước đó sẽ được gửi lại. HTTP method được dùng ở đây là Post chứ không phải Get trong URL Rewriter. Get là một dạng truy vấn cho phép đọc (read) trong khi Post là một truy vấn cho phép ghi (write). Khi đó dữ liệu của client gửi lên server sẽ nằm trong phần body của một HTTP Message chứ không phải trong phần Header như việc dùng link (liên kết) ở trên.
  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 ta lưu data 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à 1 phần trong header của HTTP Message.
  4. Sử dụng HTTP Session: Ngược với cookie, các Web Server có thể cho phép mỗi client lưu một dung lượng nhỏ data trên đó. Dữ liệu được lưu dưới dạng key/value và sẽ bị expire nếu bị timeout (sau khoảng thời gian tính từ lúc client gửi truy vấn cuối cùng đến server nếu vượt quá giới hạn thì sẽ bị hủy).

Web Application là một ví dụ minh họa cho stateless design với vài kỹ thuật nhỏ khắc phục yếu điểm của nó trong xây dựng phần mềm. Ở tầng bussiness, ta cũng có thể thiết kế tương tác dạng client-server. Hệ thống phần mềm khi đó có architecture (kiến trúc) là distributed (phân tán). EJB là một ví dụ với việc session bean được thiết kế hỗ trợ cả stateless và stateful.

nguồn: internet

Bài viết gốc được đăng tải tại thangphampt.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev