English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

khách
1 / ?
trở lại bài học

Đỉnh, Cạnh, Hướng

Một Yêu Cầu Như Một Bước Đi Trên Đồ Thị

Mọi thành phần mà yêu cầu tiếp xúc đều là một đỉnh (node): client, bộ phân giải DNS, biên CDN, proxy ngược (reverse proxy), bản sao backend (backend replica), cơ sở dữ liệu, bộ nhớ đệm (cache).

Mọi kết nối giữa hai đỉnh là một cạnh có hướng (directed edge): yêu cầu chảy về phía trước, phản hồi chảy ngược lại. Cạnh phía trước đại diện cho một kết nối TCP mở cùng giao thức ở trên.

Một yêu cầu đơn lẻ là một đường đi (path) qua đồ thị này. Tổng công việc hệ thống thực hiện để trả lời yêu cầu bằng tổng công việc tại mỗi đỉnh, cộng với độ trễ của mỗi cạnh.

Tại sao cần quan tâm? Khi bạn vẽ đồ thị, các thuộc tính sẽ hiện ra rõ ràng mà không thể thấy được trong mã nguồn:

- Số bước nhảy (Hop count): số lượng cạnh trong đường đi. Mỗi bước nhảy làm tăng độ trễ (chuyến đi mạng + xử lý tại nút). Ít bước nhảy hơn = mức sàn độ trễ thấp hơn.

- Độ vào (In-degree): số lượng cạnh trỏ VÀO một nút. Độ vào cao có nghĩa là nút nhận yêu cầu từ nhiều nguồn & phải mở rộng quy mô hoặc tự bảo vệ.

- Độ ra (Out-degree): số lượng cạnh trỏ RA khỏi một nút. Độ ra cao có nghĩa là nút phụ thuộc vào nhiều hệ thống hạ nguồn & có nhiều cách để gặp sự cố.

- Đỉnh cắt (Cut vertex): một nút duy nhất mà nếu loại bỏ nó sẽ làm đồ thị bị ngắt kết nối. Một proxy ngược (reverse proxy) không có đối tác (peer) là một đỉnh cắt; việc loại bỏ nó sẽ xóa bỏ mọi quyền truy cập đến các nguồn gốc (origins) của nó.

Yêu cầu như đường đi qua đồ thị có hướng: client, proxy, backend, database

Vẽ (hoặc mô tả bằng văn bản) đồ thị yêu cầu cho: trình duyệt client -> biên CDN -> proxy ngược -> bản sao backend -> cơ sở dữ liệu. Đếm số bước nhảy. Xác định các đỉnh cắt. Dự đoán một hệ quả vận hành khi có quá nhiều đỉnh cắt liên tiếp.

Nơi Lưu lượng Tập trung

Fan-In = Sự Tập trung

Độ vào (in-degree) của một nút = số lượng các cạnh chỉ vào nó. Trong đồ thị yêu cầu, độ vào = số lượng các nguồn thượng nguồn gửi yêu cầu.

Mô hình Fan-in: nhiều client -> một CDN; nhiều biên CDN -> ít proxy nguồn; nhiều proxy -> ít bản sao backend hơn; nhiều backend -> một cơ sở dữ liệu duy nhất.

Sự tập trung quan trọng vì nút có bậc vào (in-degree) cao nhất sẽ chịu tải tổng hợp lớn nhất. CSDL ở cuối chuỗi có thể nhận các truy vấn từ mọi yêu cầu đang hoạt động trong toàn hệ thống, ngay cả khi không có người dùng nào tạo ra nhiều tải riêng lẻ.

Fan-Out = Phụ thuộc

Bậc ra (Out-degree) của một nút = số lượng cạnh chỉ ra từ nó. Bậc ra cao có nghĩa là có nhiều phụ thuộc hạ lưu (downstream).

Một backend gọi một cơ sở dữ liệu, hai bộ nhớ đệm (caches), ba API bên ngoài & một hàng đợi (queue) có bậc ra là 7. Xác suất thành công của nó xấp xỉ bằng tích của xác suất thành công của từng thành phần hạ lưu (nếu tất cả đều bắt buộc để có một phản hồi thành công).

0.999 ^ 7 ≈ 0.993: một backend với 7 thành phần hạ lưu, mỗi thành phần có độ tin cậy 99,9%, chỉ có thể đạt độ tin cậy ~99,3% cho chính nó, ngay cả khi không có lỗi nào của chính nó.

Giảm bậc ra bằng cách: lưu kết quả hạ lưu vào bộ nhớ đệm (caching), làm cho các thành phần hạ lưu không quan trọng trở thành tùy chọn (giảm cấp độ mượt mà - graceful degradation), song song hóa những gì có thể song song hóa.

Sự bất đối xứng

Fan-in tập trung tải; fan-out nhân lên rủi ro. Một đồ thị được thiết kế tốt sẽ tối thiểu hóa cả hai tại các nút có tác động cao nhất.

Cơ sở dữ liệu (fan-in cao nhất): sử dụng bộ nhớ đệm (cache) một cách tích cực để giảm tải. Sử dụng các bản sao đọc (read replicas) để phân tán fan-in qua nhiều nút.

Dịch vụ điều phối (fan-out cao nhất): sử dụng ngắt mạch (circuit breakers) cho từng phụ thuộc, suy giảm chức năng một cách tinh tế (graceful degradation), và ngăn cách (bulkheads).

Một bản sao backend gọi 4 dịch vụ hạ nguồn, mỗi dịch vụ có độ khả dụng độc lập là 99,95%. (1) Giới hạn trên của độ khả dụng của backend là bao nhiêu nếu tất cả 4 cuộc gọi đều bắt buộc để có một phản hồi thành công? (2) Nếu 2 trong số 4 dịch vụ hạ nguồn được làm tùy chọn thông qua suy giảm chức năng một cách tinh tế (được thay thế bằng các bản sao dự phòng trong bộ nhớ đệm khi không khả dụng), giới hạn đó sẽ trở thành bao nhiêu?

Một nút được chèn vào mang lại sự linh hoạt

Gián tiếp = Thêm một nút trung gian

Không có proxy, đồ thị là: client -> backend. Client phải biết địa chỉ của backend. Việc di chuyển backend đòi hỏi phải cập nhật client (thông qua DNS hoặc cấu hình). Đây là một liên kết chặt chẽ.

Có proxy, đồ thị trở thành: client -> proxy -> backend. Client chỉ biết về proxy. Việc di chuyển backend đòi hỏi phải cập nhật cấu hình upstream của proxy, chứ không phải client.

Thao tác trên đồ thị: chèn một nút dọc theo một cạnh có sẵn. Cạnh mới client -> proxy là ổn định; cạnh mới proxy -> backend giờ đây thuộc trách nhiệm quản lý của nhóm.

Cách đọc hình học: gián tiếp thêm một lớp tách biệt thay đổi phía upstream khỏi thay đổi phía downstream. Các cạnh của từng lớp có thể được nối lại độc lập.

Chi phí của sự gián tiếp

Mỗi lớp bổ sung:

- Một bước trễ (hop) (cạnh từ client đến proxy)

- Một đỉnh cắt (cut vertex) khác trên đường đi (chính proxy)

- Một vị trí khác mà ở đó cấu hình sai có thể xảy ra

Lợi ích (đấu nối lại, mở rộng quy mô, che chắn, kết thúc TLS, phân phối tải) thường vượt trội hơn chi phí đối với bất kỳ hệ thống nào không đơn giản. Nhưng có một giới hạn: mỗi lớp gián tiếp bổ sung thêm một bước trễ & một ứng viên SPOF (điểm lỗi duy nhất) khác.

Quy tắc dân gian: bất kỳ vấn đề nào cũng có thể được giải quyết bằng cách thêm một lớp gián tiếp (ngoại trừ vấn đề là có quá nhiều lớp gián tiếp).

Một nhóm thêm CDN trước một reverse proxy hiện có. Đường đi chuyển từ `client -> proxy -> backend` (2 bước) sang `client -> CDN -> proxy -> backend` (3 bước). Hãy nêu hai lợi ích của sự gián tiếp (chấp nhận các thuật ngữ lý thuyết đồ thị) & hai chi phí.

Đọc Kiến trúc như một Đồ thị

Tổng hợp

Bạn giờ có thể đọc kiến trúc hệ thống như một đồ thị: đếm số bước nhảy (hops), xác định các đỉnh cắt (cut vertices), đo mức độ tập trung fan-in, tính ngưỡng khả dụng (availability ceiling) từ fan-out, & đánh giá các đánh đổi về gián tiếp (indirection).

Áp dụng cả bốn.

Một dịch vụ mới có kiến trúc như sau: clients -> CDN -> reverse proxy (2 replicas) -> backend tier (8 replicas) -> { DB primary, cache cluster (3 nodes), external API }.

Phân tích: (1) số bước nhảy (hop count) tối đa trên một đường dẫn yêu cầu là bao nhiêu, (2) tầng nào có fan-in cao nhất (& điều này ngụ ý gì cho việc mở rộng quy mô), (3) ngưỡng khả dụng (availability ceiling) của backend là bao nhiêu nếu DB là 99.95%, cache là 99.95%, & external API là 99.9%, tất cả đều bắt buộc, & (4) nếu loại bỏ một nút duy nhất nào, nút đó sẽ làm mất kết nối của nhiều người dùng nhất?

Ghi chú bổ trợ

Ghi chú bổ trợ

Bài học về hình học này tái cấu trúc bài học chính Proxies & Origins thành một phân tích đồ thị có hướng.

Bài học bổ trợ tiếp theo trong khóa học này, geometry_of_stateless_horizontal_scaling, sẽ lấy các phép toán về bản sao (replica) từ bài học mở rộng chính và suy ra đường cong hàng đợi, Định luật Little, và điểm uốn ở mức sử dụng 80% một cách hình học.

Làm tốt lắm.