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

Các Điểm, Các Kính, Các Hướng

Một Yêu Cầu Là Một Lướt Trên Một Đồ Thị

Mỗi thành phần mà yêu cầu chạm vào là một đỉnh: client, giải quyết DNS, cạnh CDN, reverse proxy, replica backend, cơ sở dữ liệu, cache.

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

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

Tại sao quan tâm? Một khi bạn vẽ đồ thị ra, các tính chất sẽ xuất hiện mà trước đây bạn không nhìn thấy trong mã:

- Số bước nhảy: số lượng kính trong đường dẫn. Mỗi bước nhảy đều tăng độ trễ (lượt vòng lặp mạng + xử lý đỉnh). Số bước nhảy thấp hơn = độ sàn thấp hơn trên độ trễ.

- Độ phân tán: số lượng kính chỉ vào một đỉnh. Độ phân tán cao có nghĩa là đỉnh nhận yêu cầu từ nhiều nguồn và phải mở rộng hoặc che giấu mình.

- Độ tập trung: số lượng kính chỉ ra khỏi một đỉnh. Độ tập trung cao có nghĩa là đỉnh phụ thuộc vào nhiều downstream và có nhiều cách để bị lỗi.

- Đỉnh cắt: một đỉnh đơn lẻ mà việc loại bỏ nó sẽ làm đồ thị bị đứt gãy. Một reverse proxy không có đồng nghiệp là một đỉnh cắt; việc loại bỏ nó sẽ loại bỏ toàn bộ truy cập vào các nguồn gốc của nó.

Một yêu cầu là một đường dẫn 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 -> cạnh CDN -> reverse proxy -> replica backend -> cơ sở dữ liệu. Đếm số bước nhảy. Nhận biết các đỉnh cắt. Tiên đoán một kết quả hoạt động của việc có nhiều đỉnh cắt liên tiếp.

Ở Điểm Yêu Cầu Giãn Ra

Fan-In = Nhiễm Đạm

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

Hình mẫu Fan-in: nhiều khách hàng -> một CDN; nhiều cạnh CDN -> ít proxy nguồn; nhiều proxy -> ít bản sao backend hơn; nhiều backend -> cơ sở dữ liệu duy nhất.

Nhiễm Đạm quan trọng vì nút có độ cao In cao nhất phải đối mặt với lượng tải tích lũy cao nhất. Cơ sở dữ liệu ở cuối chuỗi có thể thấy truy vấn từ mọi yêu cầu hoạt động trong hệ thống, ngay cả khi không có người dùng nào tạo ra nhiều.

Fan-Out = Tính phụ thuộc

Độ cao Out của một nút = số lượng cạnh chỉ ra khỏi nó. Độ cao Out cao nghĩa là có nhiều phụ thuộc downstream.

Một backend gọi một cơ sở dữ liệu, hai cache, ba API external và một hàng đợi có độ cao Out 7. Tính khả dụng của nó khoảng là tích của mỗi khả năng sẵn có của downstream (nếu tất cả đều cần thiết để có một phản hồi thành công).

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

Giảm độ cao Out bằng: lưu trữ kết quả downstream, làm các downstream không quan trọng optional (giảm thiểu êm ải), song song hóa những gì có thể song song.

Tính không đối xứng

Nhiễm Đạm tập trung tải; fan-out nhân rủi ro. Một đồ thị được định hình tốt sẽ giảm thiểu cả hai ở các nút có ảnh hưởng cao nhất.

Cơ sở dữ liệu (cao nhất fan-in): lưu cache tích cực để giảm tải. Các bản sao đọc để phân tán fan-in trên nhiều nút.

Dịch vụ orchestrator (cao nhất fan-out): cầu nối điện tử mỗi dependency, giảm thiểu êm ải, bulkheads.

Một bản sao backend gọi 4 dịch vụ downstream độc lập, mỗi dịch vụ có khả năng sẵn có 99,95%. (1) Khả năng sẵn có tối đa của backend là gì nếu tất cả 4 cuộc gọi đều cần thiết để có một phản hồi thành công? (2) Nếu 2 trong số 4 downstream được làm optional thông qua giảm thiểu êm ải (thay thế bằng các fallback từ cache khi unavailable), khả năng sẵn có sẽ là bao nhiêu?

Một nút chèn mua tính 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 về địa chỉ backend. Di chuyển backend yêu cầu cập nhật client (qua DNS hoặc cấu hình). Đây là một ràng buộc chặt chẽ.

Có một proxy, đồ thị trở thành: client -> proxy -> backend. Client chỉ biết về proxy. Di chuyển backend yêu cầu cập nhật cấu hình upstream của proxy, không phải client.

Hành động đồ thị: chèn một nút dọc theo một cạnh hiện có. Cánh mới client -> proxy là ổn định; cánh mới proxy -> backend bây giờ là đội ngũ quản lý.

Đọc hình học: gián tiếp thêm một lớp tách biệt sự thay đổi upstream với sự thay đổi downstream. Mỗi lớp cạnh có thể rewire độc lập.

Chi phí của Gián tiếp

Mỗi lớp thêm:

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

- Một điểm cắt thêm trên con đường (proxy itself)

- Một nơi khác có thể xảy ra sự cố cấu hình

Lợi ích (rewire, scale, shield, terminate TLS, distribute load) thường vượt trội hơn chi phí cho bất kỳ hệ thống nào không tầm thường. Nhưng có một giới hạn: mỗi lớp gián tiếp thêm một bước và một SPOF khả năng.

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 (trừ vấn đề quá nhiều lớp gián tiếp).

Một đội ngũ thêm CDN trước một reverse proxy đang tồn tại. Con đường đi từ `client -> proxy -> backend` (2 bước) đến `client -> CDN -> proxy -> backend` (3 bước). Tên hai lợi ích của việc gián tiếp (các khái niệm đồ thị được chào đón) & hai chi phí.

Đọc Một Kiến Trúc Là Một Đồ Thể

Tổng hợp

Bạn có thể đọc kiến trúc hệ thống là một đồ thị: đếm bước, xác định nút cắt, đo độ tập trung fan-in, tính giới hạn khả dụng từ fan-out & đánh giá các ưu nhược điểm của gián tiếp.

Áp dụng tất cả bốn.

Một dịch vụ mới có kiến trúc sau: clients -> CDN -> reverse proxy (2 bản sao) -> tầng backend (8 bản sao) -> { cơ sở dữ liệu chủ, cụm cache (3 nút), API bên ngoài }.

Đánh giá: (1) hop tối đa trên một đường dẫn yêu cầu đơn, (2) tầng có fan-in cao nhất (& điều đó hàm ý gì cho việc mở rộng), (3) giới hạn khả dụng của backend nếu DB là 99.95%, cache là 99.95%, & external API là 99.9%, tất cả đều cần thiết, & (4) nút đơn, nếu loại bỏ, sẽ làm mất kết nối cho nhiều người dùng nhất?

Ghi chú đồng hành

Ghi chú đồng hành

Giảng án hình học này tái hiện bài học Proxies & Origins chính là một phân tích đồ thị hướng.

Bài đồng hành tiếp theo trong khóa học này, geometry_of_stateless_horizontal_scaling, sẽ lấy phép toán bản sao từ bài học tăng quy mô chính và deriving đường cong hàng đợi, Luật Little và gót cong 80% sử dụng hình học.

Làm tốt.