Harbor

Tổng quan bài thiết kế

Cách đọc và luyện một bài thiết kế trên site: các phần của trang bài, cách dùng ba mức quy mô và bảng hạ tầng, cùng thứ tự làm bài từ dễ đến khó.

8 phút đọcBắt đầu nhanh

Cấu trúc một trang bài thiết kế

Mỗi bài thiết kế (/bai/...) đi theo đúng thứ tự của Khung trả lời 45 phút. Nhờ vậy, đọc bài cũng là luyện khung. Cấu trúc này cũng gần với cách Grokking chia mỗi bài thiết kế: yêu cầu chức năng và phi chức năng kèm ước lượng tài nguyên, thiết kế và API, rồi đánh giá theo yêu cầu phi chức năng.1

PhầnNội dungTương ứng bước
Hiểu đềGiới thiệu, yêu cầu chức năng, yêu cầu phi chức năng có số, ngoài phạm vi1. Yêu cầu
Thực thể và APICác thực thể chính, endpoint chính3. Thực thể và API
Thiết kế tổng thểMỗi yêu cầu chức năng một khối: giải thích và luồng xử lý từng bước4. Thiết kế tổng thể
Đào sâu3–4 câu hỏi khó, mỗi câu có phương án từ kém tới tốt kèm trade-off5. Đào sâu
Hạ tầng theo quy môBa mức: phép tính, bảng hạ tầng, sơ đồ, chi phí, nút thắt2. Ước lượng và 6. Mở rộng
Trong phỏng vấnCâu nên nói, bẫy hay gặpToàn buổi
Bài liên quanLink tới khái niệm, pattern, công nghệ dùng trong bàiÔn tập

Cách luyện một bài

  1. Chỉ đọc phần Hiểu đề. Che phần còn lại.
  2. Tự làm 30–45 phút trên giấy hoặc Excalidraw: ước lượng, API, sơ đồ, chọn 2 vấn đề để đào sâu.
  3. So phần Thiết kế tổng thể. Sơ đồ của bạn có đáp ứng đủ từng yêu cầu chức năng không?
  4. So phần Đào sâu. Bạn có nhận ra đúng vấn đề khó không? Phương án của bạn nằm ở mức kém, khá hay tốt? Cách xếp mức kém đến tốt là của khoá học; nguyên tắc nền từ Grokking là không có một đáp án đúng duy nhất, mỗi thành phần có ưu nhược và mỗi thiết kế có điểm yếu cần tự nêu ra.2
  5. Đọc phần Hạ tầng theo quy mô theo cách ở mục dưới.
  6. Ghi lại 2–3 ý bỏ sót và mở bài liên quan để đọc thêm.

Mẹo: đọc mục "Trong phỏng vấn" cuối bài trước khi làm lại bài lần hai. Các câu nên nói ở đó là những câu tóm tắt quyết định chính, rất hợp để mở đầu phần đào sâu.

Dùng ba mức quy mô

Phần hạ tầng có ba tab: Khởi đầu (~10.000 DAU), Tăng trưởng (~1 triệu DAU), Quy mô lớn (50 triệu+ DAU). Ý nghĩa từng mức được mô tả trong Giới thiệu khoá học và Hạ tầng theo quy mô.

Mỗi mức gồm:

  • Phép tính: các dòng ước lượng có phép nhân chia rõ ràng. Thử tự tính trước rồi so.
  • Bảng hạ tầng: từng thành phần, công nghệ chọn, số lượng, cấu hình và lý do.
  • Sơ đồ: kiến trúc ở mức đó.
  • Chi phí: khoảng USD mỗi tháng, chỉ là ước lượng của khoá học (không lấy từ sách).3
  • Thay đổi so với mức trước và nút thắt sẽ vỡ đầu tiên khi lên mức sau.

Cách đọc theo chiều ngang cũng phản ánh quan niệm hệ thống tiến hoá theo vòng lặp (bắt đầu đơn giản, gặp nút thắt thì đổi thiết kế) và quan niệm khi một khía cạnh tăng từ 10 lần trở lên thì thiết kế cũ có thể không còn đúng.45 Cách đọc hiệu quả nhất là đọc theo chiều ngang: so sánh cùng một dòng trong bảng qua ba mức. Ví dụ dòng database đi từ một Postgres managed, sang Postgres có replica, rồi sang shard hoặc Cassandra. Với mỗi thay đổi, tự hỏi: nút thắt nào ở mức trước buộc phải đổi?

Đọc bảng hạ tầng

CộtCách đọc
Thành phầnVai trò trong hệ thống: API, database, cache, queue, worker, CDN
Lựa chọnCông nghệ cụ thể. Mở bài công nghệ tương ứng nếu chưa quen
Số lượngThường tính theo công thức max(2, ceil(đỉnh / 600)) cho API Node.js (quy tắc ước lượng của khoá học)3
Cấu hìnhvCPU và RAM mỗi node
Lý doVì sao chọn và vì sao đủ ở mức này

Kiểm tra lại số lượng bằng Máy tính hạ tầng. Nếu số của bạn khác bảng, xem lại giả định: số request mỗi người, hệ số đỉnh, tỉ lệ đọc ghi. Cách tính chi tiết ở Chọn server. Grokking tính số server bằng cách chia số request mỗi giây cho năng lực một server, và nhấn mạnh ở mức thiết kế chỉ cần ước lượng thô để có cận trên hợp lý.6

Lưu ý: cấu hình và chi phí là ước lượng thận trọng. Chúng đủ để lập luận trong phỏng vấn, chưa đủ để mua hạ tầng thật khi chưa load test.

Thứ tự bài từ dễ đến khó

Nhóm 1: làm quen. Ít thành phần, một vấn đề chính rõ ràng.

BàiPattern chính
Rút gọn linkScale đọc, sinh ID
Rate limiterRedis, thuật toán đếm
Cache phân tánConsistent hashing, sharding
Theo dõi giáTác vụ định kỳ, thông báo
Tổng hợp tin tứcCrawl, scale đọc

Nhóm 2: trung bình. Có tranh chấp, quy trình nhiều bước hoặc đọc ghi lớn.

BàiPattern chính
Đặt vé sự kiệnTranh chấp tài nguyên, đột biến tải
Booking và tracking containerQuy trình nhiều bước, outbox
Hệ thống thông báoTác vụ dài, fan-out
Job schedulerTác vụ dài, khoá phân tán
DropboxFile lớn, đồng bộ
YelpTìm kiếm gần, scale đọc
Tìm kiếm bài viếtSearch index, CDC
LeetcodeTác vụ dài, sandbox
Top KScale ghi, xử lý luồng
InstagramFile lớn, feed
StravaScale ghi, dữ liệu vị trí
TinderTìm kiếm gần, tranh chấp nhẹ
Web crawlerTác vụ dài, hàng đợi lớn

Nhóm 3: khó. Nhiều vấn đề cùng lúc, cần realtime, nhất quán mạnh hoặc thông lượng rất lớn.

BàiPattern chính
News feedFan-out, scale đọc
Ứng dụng chatRealtime, scale ghi
Live commentsRealtime, fan-out lớn
Gọi xeTìm kiếm gần, tranh chấp
Giao hàng nội thànhTìm kiếm gần, quy trình nhiều bước
Flash saleTranh chấp, đột biến ×100
Đấu giá onlineTranh chấp, realtime
YouTubeFile lớn, tác vụ dài
Ad click aggregatorScale ghi, xử lý luồng
Giám sát metricScale ghi, time-series
Cờ vua onlineRealtime, trạng thái ván
Ứng dụng chat với AIStreaming, GPU, quota
Hệ thống thanh toánQuy trình nhiều bước, idempotency
Sàn giao dịch chứng khoánĐộ trễ thấp, thứ tự lệnh
Google DocsRealtime, giải quyết xung đột

Gợi ý lộ trình

Phân nhóm độ khó và cột "Pattern chính" ở trên là đánh giá của khoá học.7 Làm 2–3 bài nhóm 1 trước để quen khung. Sau đó xen kẽ nhóm 2 và nhóm 3 theo pattern: làm Đặt vé sự kiện rồi Flash sale để thấy cùng pattern tranh chấp ở hai mức độ. Làm Ứng dụng chat rồi Live comments cho realtime. Cách nhóm này giúp bạn thấy điểm chung, từ đó nhận ra pattern nhanh hơn khi gặp đề mới. Danh sách pattern và bài tương ứng có ở Tổng quan pattern.

Nguồn trích dẫn

  1. Grokking Modern System Design · ch.34 Design a URL Shortening Service (TinyURL) · mục "How will we design a URL shortening service?" và bài "Requirements of TinyURL's Design". ↩

  2. Grokking Modern System Design · ch.2 System Design Interviews · bài "How to Perform Well", mục "Discuss trade-offs". ↩

  3. Quy tắc ước lượng của khoá học, xem bài Chọn server. Không phải số liệu trích từ sách. ↩ ↩2

  4. Grokking Modern System Design · ch.1 Introduction · mục "About this course" ("Iterative process"). ↩

  5. Grokking Modern System Design · ch.2 System Design Interviews · bài "What Is a System Design Interview?", mục "Possible questions for every SDI". ↩

  6. Grokking Modern System Design · ch.5 Back-of-the-envelope Calculations · bài "Put Back-of-the-envelope Numbers in Perspective" (phần ước lượng số server ở mức thiết kế) và bài "Examples of Resource Estimation", mục "Number of servers required". ↩

  7. Chưa có nguồn trong thư viện: thư viện không xếp độ khó hay gán pattern cho từng đề; bảng này là biên tập của khoá học. ↩