🟡 Trung cấp · Bài 10 / 14

Giao tiếp & API

Cách các thành phần "nói chuyện": ba kiểu API (REST, GraphQL, gRPC) và ba kỹ thuật server đẩy dữ liệu real-time (Long polling, WebSockets, SSE).

API là gì?

API (Application Programming Interface) là tập định nghĩa & giao thức để xây dựng và tích hợp phần mềm — như một "hợp đồng" giữa bên cung cấp và bên dùng thông tin.

REST

REST (Representational State Transfer, Roy Fielding 2000). Đơn vị cơ bản là resource. Ràng buộc: Uniform Interface, Client-Server, Stateless, Cacheable, Layered system, Code on demand (tùy chọn).

HTTP verbs: GET, POST, PUT, PATCH, DELETE, HEAD. Mã phản hồi: 1xx (info), 2xx (thành công), 3xx (redirect), 4xx (lỗi client), 5xx (lỗi server).

RESTful API cho resource "users"http
GET    /users        → lấy tất cả user
GET    /users/{id}   → lấy 1 user theo id
POST   /users        → thêm user mới
PATCH  /users/{id}   → cập nhật user
DELETE /users/{id}   → xóa user

GraphQL

Ngôn ngữ truy vấn cho API (Facebook 2015) — client lấy chính xác dữ liệu cần, không hơn. Đơn vị cơ bản là query. Khái niệm: Schema, Queries (& mutation), Resolvers.

schema & querygraphql
type Query { getUser: User }
type User { id: ID  name: String  city: String  state: String }

# Client chỉ yêu cầu field cần
{ getUser { id  name  city } }

Ưu: hết over-fetching, schema chặt, payload tối ưu. Nhược: đẩy phức tạp về server, caching khó, có N+1 problem.

gRPC

Framework RPC hiệu năng cao, mã nguồn mở. Dùng Protocol Buffers (serialize nhị phân, nhỏ & nhanh hơn JSON) làm IDL.

file *.protoprotobuf
service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest  { string greeting = 1; }
message HelloResponse { string reply = 1; }

Ưu: nhẹ, hiệu năng cao, codegen sẵn, bi-directional streaming. Nhược: mới hơn, hỗ trợ browser hạn chế, học khó hơn, không human-readable.

So sánh REST vs GraphQL vs gRPC ⭐

RESTGraphQLgRPC
Chattiness (số round-trip)CaoThấpTrung bình
PerformanceTốtTốtTuyệt
ComplexityTrung bìnhCaoThấp
CachingTuyệtTùy biếnTùy biến
CodegenKémTốtTuyệt
VersioningDễTùy biếnKhó

Cái nào tốt hơn? Không có "viên đạn bạc" — chọn theo domain & yêu cầu. REST cho API công khai phổ thông, GraphQL khi client cần linh hoạt & giảm băng thông, gRPC cho giao tiếp nội bộ microservices low-latency.

Long polling vs WebSockets vs SSE

Mặc định web là client-server (client luôn khởi tạo). Ba cách để server "đẩy" dữ liệu xuống client:

Long polling
Long polling — client hỏi, server giữ kết nối đến khi có dữ liệu rồi trả
WebSockets
WebSockets — kết nối hai chiều (full-duplex) bền vững
Server-Sent Events
SSE — một chiều, server đẩy event xuống client
Long pollingWebSocketsSSE
ChiềuClient hỏi, server giữ rồi trảHai chiều (full-duplex)Một chiều (server → client)
Kết nốiMở mới mỗi vòngMột kết nối TCP bền vữngMột kết nối dài
Giao thứcHTTPws:// (sau HTTP Upgrade)HTTP
Binary data—CóKhông
ScaleKém (mỗi request 1 kết nối)TốtHạn chế (giới hạn số kết nối)
Hợp choDự án nhỏReal-time 2 chiều (chat, game)Đẩy event/cập nhật
✅ Tóm tắt bài 10

REST (resource, stateless, caching tốt — API công khai), GraphQL (query đúng field — linh hoạt, hết over-fetch), gRPC (protobuf, streaming — nội bộ microservices). Để server đẩy real-time: Long polling (đơn giản, kém scale), WebSockets (2 chiều — chat/game), SSE (1 chiều — đẩy cập nhật).