Kiến trúc hệ thốngGiao tiếp (Communication)

Giao tiếp (Communication)

Nội dung bài

Giao tiếp (Communication)

Chủ đề23 phút đọcThe System Design Primer - mục "Communication"

Mục lục
  1. Nội dung gốc
  2. Ghi chú của người dịch

Giao tiếp (Communication)

Nội dung gốc

Mô hình OSI 7 tầng
Nguồn: OSI 7 layer model

Giao thức truyền siêu văn bản (Hypertext transfer protocol - HTTP)

HTTP là một phương thức để mã hóa và vận chuyển dữ liệu giữa client và server. Đây là giao thức kiểu yêu cầu/phản hồi (request/response): client gửi yêu cầu, server trả phản hồi kèm nội dung liên quan và thông tin trạng thái hoàn tất của yêu cầu. HTTP mang tính tự đóng gói (self-contained), cho phép yêu cầu và phản hồi đi qua nhiều router và server trung gian thực hiện cân bằng tải (load balancing), lưu đệm (caching), mã hóa (encryption) và nén (compression).

Một yêu cầu HTTP cơ bản gồm một động từ (verb, hay method) và một tài nguyên (resource, hay endpoint). Dưới đây là các động từ HTTP thông dụng:

Động từMô tảLũy đẳng (idempotent)*An toàn (safe)Có thể cache
GETĐọc một tài nguyênCóCóCó
POSTTạo một tài nguyên hoặc kích hoạt một tiến trình xử lý dữ liệuKhôngKhôngCó, nếu phản hồi chứa thông tin về độ tươi (freshness)
PUTTạo hoặc thay thế một tài nguyênCóKhôngKhông
PATCHCập nhật một phần tài nguyênKhôngKhôngCó, nếu phản hồi chứa thông tin về độ tươi (freshness)
DELETEXóa một tài nguyênCóKhôngKhông

*Có thể gọi nhiều lần mà không cho ra kết quả khác nhau.

HTTP là một giao thức tầng ứng dụng (application layer), dựa trên các giao thức tầng thấp hơn như TCP và UDP.

Nguồn và đọc thêm: HTTP

Giao thức điều khiển truyền vận (Transmission control protocol - TCP)

Sơ đồ truyền gói tin qua TCP
Nguồn: How to make a multiplayer game

TCP là một giao thức hướng kết nối (connection-oriented) chạy trên mạng IP. Kết nối được thiết lập và kết thúc bằng một quá trình bắt tay (handshake). Mọi gói tin (packet) được gửi đi đều được đảm bảo tới đích đúng thứ tự ban đầu và không bị hỏng, nhờ:

Nếu bên gửi không nhận được phản hồi đúng, nó sẽ gửi lại các gói tin. Nếu hết thời gian chờ (timeout) nhiều lần, kết nối sẽ bị hủy. TCP cũng cài đặt điều khiển luồng (flow control) và điều khiển tắc nghẽn (congestion control). Những đảm bảo này gây ra độ trễ và nhìn chung làm việc truyền dữ liệu kém hiệu quả hơn so với UDP.

Bắt tay ba bước của TCP trước khi truyền dữ liệu Client Server SYN SYN-ACK ACK sau đó mới truyền dữ liệu
TCP bắt tay ba bước (SYN, SYN-ACK, ACK) để thiết lập kết nối trước khi truyền dữ liệu thật.

Để đảm bảo thông lượng cao, web server có thể giữ mở một số lượng lớn kết nối TCP, dẫn tới tiêu tốn nhiều bộ nhớ. Việc duy trì nhiều kết nối mở giữa các luồng (thread) của web server và, chẳng hạn, một server memcached có thể rất tốn kém. Gộp kết nối (connection pooling) có thể giúp ích, bên cạnh việc chuyển sang UDP ở những chỗ phù hợp.

TCP hữu ích cho các ứng dụng đòi hỏi độ tin cậy cao nhưng ít khắt khe về thời gian. Một số ví dụ gồm web server, thông tin cơ sở dữ liệu, SMTP, FTP và SSH.

Dùng TCP thay vì UDP khi:

Giao thức gói dữ liệu người dùng (User datagram protocol - UDP)

Sơ đồ truyền gói tin qua UDP
Nguồn: How to make a multiplayer game

UDP là giao thức phi kết nối (connectionless). Các datagram (tương tự gói tin) chỉ được đảm bảo ở mức từng datagram. Datagram có thể tới đích sai thứ tự hoặc không tới được. UDP không hỗ trợ điều khiển tắc nghẽn. Không có những đảm bảo như TCP, UDP nhìn chung hiệu quả hơn.

UDP có thể phát quảng bá (broadcast), gửi datagram tới mọi thiết bị trong mạng con (subnet). Điều này hữu ích với DHCP, vì client khi đó chưa nhận được địa chỉ IP, nên TCP không có cách nào truyền luồng dữ liệu khi chưa có địa chỉ IP.

UDP kém tin cậy hơn nhưng hoạt động tốt trong các trường hợp thời gian thực như VoIP, gọi video, phát trực tuyến (streaming) và game nhiều người chơi thời gian thực.

Dùng UDP thay vì TCP khi:

TCP giao gói đúng thứ tự có xác nhận, UDP không đảm bảo TCP Client Server 1 2 3 ACK về client — gói mất được gửi lại, đúng thứ tự UDP Client Server 1 3 không bắt tay, không ACK — gói có thể mất, sai thứ tự
TCP đánh số và xác nhận (ACK) từng gói, gửi lại nếu mất; UDP gửi thẳng không bắt tay, gói có thể mất hoặc tới sai thứ tự.

Nguồn và đọc thêm: TCP và UDP

Gọi thủ tục từ xa (Remote procedure call - RPC)

Sơ đồ luồng gọi RPC giữa client và server
Nguồn: Crack the system design interview

Trong RPC, client khiến một thủ tục (procedure) được thực thi ở một không gian địa chỉ khác, thường là trên một server từ xa. Thủ tục được viết như thể đó là một lời gọi thủ tục cục bộ, che giấu khỏi chương trình client các chi tiết về cách giao tiếp với server. Lời gọi từ xa thường chậm hơn và kém tin cậy hơn lời gọi cục bộ, nên việc phân biệt lời gọi RPC với lời gọi cục bộ là điều có ích. Các framework RPC phổ biến gồm Protobuf, Thrift và Avro.

RPC là một giao thức yêu cầu - phản hồi:

Ví dụ các lời gọi RPC:

GET /someoperation?data=anId

POST /anotheroperation
{
  "data":"anId";
  "anotherdata": "another value"
}

RPC tập trung vào việc phơi ra các hành vi (behavior). RPC thường được dùng cho giao tiếp nội bộ vì lý do hiệu năng, vì bạn có thể tự viết các lời gọi native sao cho khớp nhất với trường hợp sử dụng của mình.

Chọn thư viện native (hay SDK) khi:

Các HTTP API theo phong cách REST thường được dùng nhiều hơn cho API công khai.

Nhược điểm: RPC

Chuyển giao trạng thái biểu diễn (Representational state transfer - REST)

REST là một phong cách kiến trúc áp đặt mô hình client/server, trong đó client thao tác trên một tập tài nguyên do server quản lý. Server cung cấp biểu diễn (representation) của tài nguyên và các hành động có thể thay đổi tài nguyên hoặc lấy về một biểu diễn mới của tài nguyên. Mọi giao tiếp đều phải phi trạng thái (stateless) và có thể cache.

Một giao diện RESTful có bốn đặc tính:

Ví dụ các lời gọi REST:

GET /someresources/anId

PUT /someresources/anId
{"anotherdata": "another value"}

REST tập trung vào việc phơi ra dữ liệu. Nó giảm thiểu sự phụ thuộc lẫn nhau (coupling) giữa client và server, và thường được dùng cho các HTTP API công khai. REST dùng một cách thức tổng quát và đồng nhất hơn để phơi ra tài nguyên thông qua URI, biểu diễn thông qua header, và hành động thông qua các động từ như GET, POST, PUT, DELETE và PATCH. Nhờ phi trạng thái, REST rất phù hợp cho mở rộng theo chiều ngang (horizontal scaling) và phân vùng (partitioning).

Nhược điểm: REST

RPC gọi mỗi endpoint riêng cho từng việc, REST dùng một URI với nhiều động từ RPC — mỗi việc một endpoint /signup /resign /readPerson Server REST — một URI, nhiều động từ /persons/1234 Server GET PUT DELETE
RPC: mỗi hành động có một endpoint riêng (/signup, /resign...). REST: một URI cho mỗi tài nguyên, hành động chọn qua động từ HTTP (GET/PUT/DELETE).

So sánh lời gọi RPC và REST

Thao tácRPCREST
Đăng kýPOST /signupPOST /persons
Hủy tài khoảnPOST /resign
{
"personid": "1234"
}
DELETE /persons/1234
Đọc thông tin một ngườiGET /readPerson?personid=1234GET /persons/1234
Đọc danh sách vật phẩm của một ngườiGET /readUsersItemsList?personid=1234GET /persons/1234/items
Thêm một vật phẩm vào danh sách của một ngườiPOST /addItemToUsersItemsList
{
"personid": "1234";
"itemid": "456"
}
POST /persons/1234/items
{
"itemid": "456"
}
Cập nhật một vật phẩmPOST /modifyItem
{
"itemid": "456";
"key": "value"
}
PUT /items/456
{
"key": "value"
}
Xóa một vật phẩmPOST /removeItem
{
"itemid": "456"
}
DELETE /items/456

Nguồn: Do you really know why you prefer REST over RPC

Nguồn và đọc thêm: REST và RPC


Nguồn: The System Design Primer - mục "Communication" — Donne Martin và cộng đồng đóng góp

Giấy phép: CC BY 4.0 (nguyên bản: Donne Martin, The System Design Primer)

Xem bản gốc

Bài tiếp theoBảo mật (Security)