
System Design Trainer là gì?
System Design Trainer là một bảng trắng tương tác để luyện phỏng vấn thiết kế hệ thống. Bạn chọn một kịch bản, kéo các thành phần AWS hoặc Azure vào canvas, kết nối chúng thành một kiến trúc và chạy mô phỏng dung lượng xác định.
Trình mô phỏng ước tính lưu lượng mà mỗi thành phần có thể hỗ trợ, xác định nút thắt cổ chai của hệ thống và làm nổi bật các rủi ro kiến trúc. Khi thiết kế đã sẵn sàng, Jev có thể đánh giá những lựa chọn không thể được phán đoán chỉ bằng tính toán dung lượng, bao gồm khả năng mở rộng, độ tin cậy, thiết kế dữ liệu và phần giải thích bằng văn bản của bạn.
Tính năng chính
- Canvas kiến trúc tương tác: Bảng trắng được xây dựng bằng React Flow thông qua
@xyflow/react. - Luyện tập có cấu trúc: Dự án bao gồm 15 cấp độ trong bốn chương.
- Mô hình hóa dung lượng trực tiếp: Mỗi nút hiển thị mức sử dụng và ước tính số người dùng mà nút có thể hỗ trợ.
- Chẩn đoán kiến trúc: Trình mô phỏng phát hiện các điểm lỗi đơn, bộ cân bằng tải bị thiếu và các máy khách kết nối trực tiếp với cơ sở dữ liệu.
- Ước tính chi phí và khả dụng: Hệ thống cung cấp các chỉ số bổ sung לצד các phép tính thông lượng.
- Đánh giá theo phong cách phỏng vấn: Jev chấm điểm khả năng mở rộng, độ tin cậy, thiết kế dữ liệu và phần giải thích bằng văn bản, sau đó đề xuất nội dung cần cải thiện tiếp theo.
- Công nghệ tùy chỉnh: Bạn có thể nhập các công nghệ như Kafka, MongoDB hoặc NGINX. Jev phân loại vai trò kiến trúc của chúng để ứng dụng có thể gán một hồ sơ dung lượng.
- Lưu tiến trình cục bộ: Thiết kế và tiến trình kịch bản được lưu trong trình duyệt.
- Chơi tự do: Một bảng trắng mở được cung cấp bên ngoài các cấp độ có cấu trúc.
Cài đặt và chạy dự án
1. Cài đặt các dependency
Sao chép hoặc tải xuống repository, mở thư mục của repository trong terminal và cài đặt các dependency npm:
npm install
2. Tạo tệp môi trường cục bộ
Sao chép mẫu môi trường đi kèm thành .env.local:
cp .env.example .env.local
3. Cấu hình Jev
Để nhận câu trả lời thực từ Jev, hãy thêm giá trị TYPESAFE_API_KEY vào .env.local. Jev được triển khai trong lib/server/jev.ts bằng @typesafe-ai/sdk.
Ứng dụng vẫn có thể chạy mà không cần API key. Khi đó, phản hồi của Jev sẽ chuyển sang một bản mô phỏng được gắn nhãn rõ ràng, cho phép bạn khám phá phần còn lại của quy trình mà không cần đánh giá bên ngoài.
4. Khởi động máy chủ phát triển
npm run dev
Mở địa chỉ cục bộ được máy chủ phát triển cung cấp để bắt đầu sử dụng trình luyện tập.
Hoàn thành bài tập thiết kế hệ thống đầu tiên
- Chọn đề bài. Chọn một kịch bản, chẳng hạn như thiết kế hạ tầng cho một triệu người dùng. Mỗi kịch bản cung cấp số lượng người dùng và các yêu cầu cố định.
- Đọc mục tiêu. Các cấp độ bao gồm mục tiêu bắt buộc và mục tiêu thưởng tùy chọn, được kiểm tra khi bạn chạy thiết kế.
- Thêm các thành phần đám mây. Kéo các thành phần AWS hoặc Azure phù hợp vào bảng trắng.
- Kết nối kiến trúc. Tạo các đường dẫn yêu cầu và dữ liệu giữa máy khách, thành phần mạng, dịch vụ ứng dụng, bộ nhớ đệm, hàng đợi và cơ sở dữ liệu theo mức phù hợp với kịch bản.
- Chạy thiết kế. Xem lại mức sử dụng, ước tính số người dùng được hỗ trợ, khả dụng, chi phí và các cảnh báo kiến trúc.
- Giải quyết nút thắt cổ chai. Cập nhật thiết kế dựa trên các thành phần quá tải hoặc cảnh báo cấu trúc, sau đó chạy lại.
- Yêu cầu Jev phản hồi. Gửi thiết kế và phần giải thích bằng văn bản để đánh giá khi bạn đã sẵn sàng.
Cách tính điểm cấp độ
Hoàn thành mọi mục tiêu bắt buộc sẽ nhận được một ngôi sao. Mỗi mục tiêu thưởng mang lại thêm một ngôi sao. Các ngôi sao cung cấp XP và đóng góp vào thứ hạng của bạn, trong khi tiến trình được lưu giữ trong trình duyệt.
Chương 4 yêu cầu bạn xây dựng lại các kiến trúc tham chiếu từ Azure Architecture Center. Sau khi hoàn thành một trong các cấp độ này, trình luyện tập sẽ liên kết đến kiến trúc gốc.
Tìm hiểu mô hình dung lượng
Engine dung lượng nằm trong lib/simulate.ts. Engine này mang tính xác định và không sử dụng AI. Tải cao điểm được suy ra từ kịch bản theo mối quan hệ sau:
DAU × requests per day ÷ 86,400 × peak factor
Mô hình phân tách tải này thành các lượt đọc và ghi, sau đó truyền tải từ nút Users qua đồ thị kết nối.
Các thành phần phổ biến ảnh hưởng đến lưu lượng như thế nào
- CDN: Hấp thụ phần lưu lượng mà kịch bản đánh dấu là có thể lưu vào bộ nhớ đệm tại biên.
- Bộ nhớ đệm: Hấp thụ các lượt đọc theo tỷ lệ truy cập trúng. Mô hình hỗ trợ cả cách đặt bộ nhớ đệm-aside cùng cấp và cách đặt inline.
- Hàng đợi: Loại các lượt ghi khỏi đường dẫn đồng bộ và điều tiết chúng về tốc độ yêu cầu trung bình.
- Các thành phần cùng cấp: Các thành phần cùng loại chia đều tải. Ví dụ, một bộ cân bằng tải kết nối với hai nhóm ứng dụng sẽ phân phối lưu lượng giữa chúng.
- Cơ sở dữ liệu SQL: Dung lượng ghi bị giới hạn bởi một máy chính.
- Cơ sở dữ liệu NoSQL: Dung lượng ghi tăng theo số lượng phân vùng.
Mỗi nút báo cáo mức sử dụng và ước tính supports ~N users, được tính bằng số người dùng của kịch bản chia cho mức sử dụng. Dung lượng tổng thể của hệ thống được xác định bởi nút thắt cổ chai có ước tính số người dùng được hỗ trợ thấp nhất.
Ví dụ về một lần lặp thiết kế
Giả sử một thiết kế gửi toàn bộ lưu lượng máy khách trực tiếp đến một thành phần ứng dụng duy nhất rồi đến cơ sở dữ liệu. Việc chạy mô phỏng có thể cho thấy ứng dụng hoặc cơ sở dữ liệu là nút thắt cổ chai, đồng thời phát hiện các cảnh báo về độ tin cậy.
Sau đó, bạn có thể điều chỉnh kiến trúc bằng cách thêm các thành phần phân phối, bộ nhớ đệm, xử lý bất đồng bộ hoặc dữ liệu phù hợp. Ví dụ, các nhóm ứng dụng đồng cấp phía sau bộ cân bằng tải có thể chia nhỏ lưu lượng ứng dụng, bộ nhớ đệm có thể giảm số lần đọc cơ sở dữ liệu theo tỷ lệ truy cập trúng, còn hàng đợi có thể chuyển các thao tác ghi ra khỏi đường dẫn đồng bộ. Hãy chạy lại mô hình sau mỗi thay đổi để xem liệu nút thắt cổ chai có chuyển sang nơi khác hay không.
Ước tính dung lượng cao hơn không tự động khiến thiết kế trở nên đúng đắn. Hãy sử dụng Jev để đánh giá các đánh đổi về độ tin cậy, thiết kế dữ liệu, khả năng mở rộng và cơ sở lập luận đằng sau các lựa chọn của bạn.
Sử dụng Jev hiệu quả
Bộ mô phỏng tất định cung cấp các con số đã tính toán cho Jev dưới dạng dữ kiện. Jev sau đó xử lý những đánh giá không thể quy giản thành các công thức thông lượng.
- Điểm đánh giá: Đánh giá khả năng mở rộng, độ tin cậy, thiết kế dữ liệu và phần giải thích bằng văn bản.
- Lựa chọn cải thiện: Chọn nội dung nên được cải thiện tiếp theo.
- Đánh giá theo danh sách kiểm tra: Tạo một Noul cho mỗi mục trong danh sách kiểm tra của kịch bản.
- Phân loại thành phần tùy chỉnh: Gán một vai trò kiến trúc cho công nghệ bạn nhập, cho phép trình huấn luyện áp dụng hồ sơ dung lượng tương ứng.
Để nhận phản hồi tốt hơn, hãy trình bày rõ ràng phần giải thích bằng văn bản. Mô tả luồng lưu lượng, các giả định về khả năng mở rộng, cách xử lý lỗi, các mẫu đọc và ghi, cũng như lý do mỗi thành phần chính được đưa vào.
Mẹo nâng cao
Tối ưu nút thắt cổ chai, không phải mọi thành phần
Hệ thống chỉ hỗ trợ được số người dùng tối đa bằng khả năng của thành phần giới hạn. Hãy bắt đầu với nút có ước tính số người dùng được hỗ trợ thấp nhất. Sau khi thay đổi thiết kế, hãy chạy lại mô phỏng vì việc giải quyết một nút thắt cổ chai có thể làm lộ ra một nút thắt khác.
So sánh các đường dẫn đồng bộ và bất đồng bộ
Hàng đợi đưa các thao tác ghi ra khỏi đường dẫn yêu cầu đồng bộ và điều hòa chúng theo tải trung bình. Hãy sử dụng mô hình để so sánh đường dẫn ghi trực tiếp với kiến trúc có hàng đợi khi kịch bản cho phép xử lý bất đồng bộ.
Kiểm thử vị trí đặt bộ nhớ đệm
Bộ mô phỏng nhận diện các bộ nhớ đệm được sử dụng như thành phần đồng cấp trong mô hình cache-aside và các bộ nhớ đệm được đặt nội tuyến. Hãy quan sát cách vị trí đặt và tỷ lệ truy cập trúng ảnh hưởng đến lưu lượng đọc ở các thành phần phía sau.
Chú ý các cảnh báo cấu trúc
Đừng chỉ tập trung vào mức sử dụng. Hãy kiểm tra các điểm lỗi đơn, bộ cân bằng tải bị thiếu và các kết nối trực tiếp từ máy khách đến cơ sở dữ liệu. Những cảnh báo này có thể chỉ ra các điểm yếu trong thiết kế liên quan đến độ tin cậy hoặc bảo mật ngay cả khi dung lượng thực tế vẫn đủ.
Kiểm tra nguồn đằng sau các con số trong danh mục
Dữ liệu về dung lượng, khả dụng và chi phí được định nghĩa trong lib/catalog.ts. Mỗi con số đều có nguồn được hiển thị trong thẻ thuộc tính của thành phần. Các giá trị được phân loại là giới hạn chính thức, SLA chính thức, điểm chuẩn của nhà cung cấp, giả định hoặc dịch vụ không có giới hạn được công bố.
- Giới hạn chính thức: Hạn mức AWS hoặc Azure được công bố, chẳng hạn như giới hạn tốc độ yêu cầu ở cấp tài khoản.
- SLA chính thức: Cam kết thời gian hoạt động hằng tháng của nhà cung cấp.
- Điểm chuẩn của nhà cung cấp: Chỉ số hiệu năng được công bố nhưng không được bảo đảm.
- Giả định: Giá trị được mô hình hóa khi không có số liệu từ nhà cung cấp. Dự án cũng xem mọi chi phí là các giả định.
- Không có giới hạn được công bố: Dịch vụ được mô hình hóa là có thể mở rộng độc lập, vì vậy không trở thành nút thắt cổ chai.
README nêu rằng các nguồn này được kiểm tra lần cuối vào tháng 9 năm 2026. Hạn mức đám mây có thể thay đổi và nhiều hạn mức có thể được tăng lên, vì vậy kết quả mô phỏng nên được xem là các ước tính thay vì sự bảo đảm.
Khám phá hoặc mở rộng các kịch bản
Các định nghĩa kịch bản được lưu trong lib/scenarios.ts, còn 15 cấp độ có cấu trúc được định nghĩa trong lib/levels.ts. Hãy thêm kịch bản vào lib/scenarios.ts khi mở rộng các nội dung luyện tập hiện có.
Hiểu về cơ chế lưu trữ trong trình duyệt
Thiết kế trên canvas được lưu theo từng kịch bản trong localStorage, và tiến độ cũng được lưu trong trình duyệt. Hãy nhớ rằng bộ nhớ trình duyệt chỉ cục bộ đối với hồ sơ trình duyệt và môi trường hiện tại.
Kết luận
System Design Trainer kết hợp canvas kiến trúc đám mây tương tác, mô hình hóa dung lượng tất định, các mục tiêu có cấu trúc và hoạt động đánh giá thiết kế dựa trên Jev. Hãy sử dụng bộ mô phỏng để kiểm thử hành vi có thể đo lường, sử dụng các cảnh báo để phát hiện vấn đề cấu trúc và sử dụng Jev để cải thiện lập luận cũng như phân tích đánh đổi được kỳ vọng trong một cuộc phỏng vấn thiết kế hệ thống.
