0

6 RÀNG BUỘC KIẾN TRÚC REST (REST ARCHITECTURAL CONSTRAINTS)

khi nói đến REST (Representational State Transfer), 90% lập trình viên thường nghĩ ngay đến việc "gọi API trả về chuỗi JSON thông qua các phương thức GET, POST, PUT, DELETE". Nhưng sự thật là: REST không phải là một giao thức hay định dạng dữ liệu.

REST là một phong cách kiến trúc (Architectural Style) được Roy Fielding định nghĩa vào năm 2000. Để một hệ thống được công nhận là "RESTful" thực sự, nó bắt buộc phải tuân thủ 6 ràng buộc kiến trúc (Architecture Constraints) cốt lõi dưới đây. Nếu vi phạm, hệ thống của bạn thực chất chỉ là HTTP RPC (Remote Procedure Call) đội lốt REST.

1. Client-Server (Phân tách Khách - Chủ)

Đây là nguyên tắc tách bạch hoàn toàn trách nhiệm giữa giao diện người dùng (Client) và hệ thống lưu trữ dữ liệu (Server).

  • Bản chất: Client không bao giờ quan tâm đến việc dữ liệu được lưu trong MySQL hay Postgres, dùng Laravel hay Golang. Ngược lại, Server không quan tâm Client là app Android, web Vue.js hay một thiết bị IoT.

  • Giá trị mang lại: Cho phép cả hai phía phát triển, mở rộng quy mô (scale) và triển khai một cách độc lập hoàn toàn.

2. Stateless (Phi trạng thái)

Đây là ràng buộc quan trọng nhất quyết định khả năng mở rộng (Scalability) của hệ thống Backend.

  • Bản chất: Server tuyệt đối không lưu trữ bất kỳ bối cảnh (context) hoặc trạng thái (state) nào của Client giữa các lần request. (Nói cách khác: Khai tử hoàn toàn $_SESSION lưu trên RAM máy chủ).

  • Cách hoạt động: Mỗi một request gửi từ Client lên Server phải chứa đầy đủ mọi thông tin cần thiết để Server có thể hiểu và xử lý (ví dụ: gửi kèm JWT Token trong mỗi request để chứng thực).

  • Giá trị mang lại: Khi Server không lưu state, bạn có thể dễ dàng nhân bản từ 1 Server lên 100 Server đứng sau Load Balancer. Request của user rơi vào bất kỳ Server nào cũng đều được xử lý thành công.

3. Cacheability (Khả năng lưu trữ bộ nhớ đệm)

Hệ thống mạng là nút thắt cổ chai lớn nhất. REST yêu cầu dữ liệu trả về phải được dán nhãn rõ ràng là "được phép cache" hay "không được phép cache".

  • Bản chất: Server sử dụng các HTTP Headers (như Cache-Control, ETag, Expires) để báo cho Client hoặc các Proxy biết dữ liệu này có thể được lưu lại dùng dần trong bao lâu.

  • Giá trị mang lại: Triệt tiêu các vòng lặp truy vấn dư thừa xuống Database, giảm độ trễ mạng và tiết kiệm băng thông cực kỳ hiệu quả.

4. Uniform Interface (Giao diện đồng nhất)

Đây là yếu tố tạo nên sự khác biệt giữa một API RESTful chuẩn và một đống API hỗn độn. Nó buộc toàn bộ kiến trúc phải tuân theo một quy chuẩn giao tiếp thống nhất, bao gồm 4 quy tắc nhỏ:

  • Định danh tài nguyên (Resource Identification): Mọi thứ đều là tài nguyên và được định danh bằng URI (ví dụ: /api/users/105 thay vì /api/getUserById?id=105).

  • Thao tác qua biểu diễn (Manipulation through Representations): Client lấy được bản biểu diễn (JSON/XML) của tài nguyên và dùng chính nó để yêu cầu Server cập nhật hoặc xóa tài nguyên.

  • Tin nhắn tự mô tả (Self-descriptive Messages): Mỗi request/response chứa đủ thông tin để hiểu nó. Ví dụ: Dùng đúng HTTP Method (GET để đọc, POST để tạo mới), dùng đúng HTTP Status Code (200, 201, 404, 500), và chỉ định rõ Content-Type: application/json.

  • HATEOAS (Hypermedia As The Engine Of Application State): Response trả về không chỉ chứa dữ liệu, mà phải chứa cả các đường link (hyperlinks) dẫn đến các hành động tiếp theo, giúp Client tự khám phá API mà không cần đọc document. (Đa số các API hiện nay thường bỏ qua phần này vì tính phức tạp của nó).

5. Layered System (Hệ thống phân tầng)

Trong một kiến trúc mạng lớn, Client không bao giờ biết được nó đang kết nối trực tiếp với Server cuối cùng hay chỉ đang nói chuyện với một trạm trung chuyển.

  • Bản chất: Giữa Client và Server có thể tồn tại vô số các lớp trung gian như API Gateway, Load Balancer (Nginx, HAProxy), Cache Server (Redis, Varnish), hay Web Application Firewall (WAF).

  • Giá trị mang lại: Tách biệt các mối lo ngại về bảo mật, cân bằng tải. Bạn có thể chèn thêm bao nhiêu lớp tùy thích vào giữa mà không làm thay đổi logic code hay cấu trúc API.

6. Code on Demand (Mã theo yêu cầu - Tùy chọn)

Đây là ràng buộc duy nhất mang tính tùy chọn (optional) trong REST.

  • Bản chất: Server có thể tạm thời mở rộng hoặc tùy biến chức năng của Client bằng cách gửi các đoạn mã thực thi (executable code) xuống cho Client chạy.

  • Ví dụ: Server trả về một đoạn mã JavaScript, Java Applets, hoặc WebAssembly để trình duyệt tải về và thực thi ở phía người dùng.

Nắm vững 6 ràng buộc kiến trúc này giúp bạn chuyển từ tư duy "viết API cho có chạy" sang tư duy "thiết kế API chuẩn mực enterprise". Khi các service giao tiếp với nhau bằng một bộ quy tắc khắt khe và nhất quán, hệ thống phân tán của bạn sẽ sở hữu sức chịu tải, khả năng bảo trì và độ ổn định vượt trội.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí