Harbor

Giới thiệu khoá học

Khoá học system design bằng tiếng Việt cho lập trình viên JS: mỗi bài là một hệ thống thật, được thiết kế ở ba mức quy mô để bạn thấy hạ tầng thay đổi thế nào khi người dùng tăng.

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

Khoá học này dành cho ai

Khoá học viết cho lập trình viên full-stack JavaScript đã làm việc khoảng 4 năm trở lên với React và Node.js. Bạn đã viết API, làm việc với Postgres hoặc MongoDB, có thể đã dùng Redis để cache. Điều còn thiếu thường là cách nhìn cả hệ thống: khi nào cần queue, khi nào phải shard database, một server chịu được bao nhiêu request, và cách trình bày tất cả điều đó trong một buổi phỏng vấn ngắn (Grokking ghi buổi system design thường dài khoảng 35–40 phút).1

Mục tiêu của khoá có hai phần:

  • Qua được vòng system design ở mức mid, senior và một phần staff. Ứng viên mid và senior (trên hai năm kinh nghiệm) thường có ít nhất một vòng system design; ứng viên senior hơn thường có hai đến ba vòng.2
  • Ra quyết định hạ tầng tốt hơn trong công việc thật, nhất là ở công ty nhỏ, nơi bạn vừa viết code vừa chọn server. System design không chỉ dùng cho phỏng vấn: nó gần với công việc thật hơn so với bài phỏng vấn code.3

Khoá học gồm những gì

Nội dung chia thành hai loại trang.

Bài học (/hoc/...) chia theo năm nhóm:

NhómNội dungVí dụ
Bắt đầuCách học, khung trả lời, các trang tổng quanKhung trả lời 45 phút
Khái niệmKiến thức nền cần dùng ở mọi bàiCaching, Sharding
Hạ tầngChọn server, database, tính số máyChọn server, Máy tính hạ tầng
PatternLời giải lặp lại ở nhiều bàiTranh chấp tài nguyên
Công nghệCông cụ cụ thể, giới hạn và cách vận hànhRedis, Kafka

Bài thiết kế (/bai/...) là các đề phỏng vấn quen thuộc như Rút gọn link, Đặt vé sự kiện hay Ứng dụng gọi xe. Mỗi bài đi từ hiểu đề, API, thiết kế tổng thể, các câu hỏi đào sâu, tới hạ tầng ở ba mức quy mô. Cách chia này giống Grokking: tách các khối xây dựng dùng chung (load balancer, cache, queue...) ra học riêng, để khi làm đề chỉ cần tập trung vào phần riêng của bài.4

Ba mức quy mô

Đây là điểm khác chính của khoá. Cùng một sản phẩm, hạ tầng cho 10 nghìn người dùng khác hẳn hạ tầng cho 50 triệu người dùng. Grokking nhắc một quan niệm phổ biến: khi một khía cạnh của hệ thống tăng từ 10 lần trở lên, thiết kế cũ có thể không còn đứng vững, vì thiết kế hiếm khi scale tuyến tính theo tải.5 Mỗi bài thiết kế đều trình bày cả ba mức với cùng một ý nghĩa:

MứcNgười dùngTải đỉnh (ước lượng)Hạ tầng điển hìnhAi vận hành
1 · Khởi đầu~10.000 DAUvài chục req/s1–2 server hoặc Cloud Run, một Postgres managedDev kiêm vận hành
2 · Tăng trưởng~1 triệu DAUvài nghìn req/sAPI stateless tự scale, Redis, queue, CDN, read replica1–3 người DevOps/SRE
3 · Quy mô lớn50 triệu+ DAUhàng chục nghìn req/s trở lênSharding, DB phân tán, Kafka, Kubernetes nhiều zone hoặc regionĐội SRE và platform riêng

Các ngưỡng người dùng, tải đỉnh và cách vận hành trong bảng là giả định của khoá học, chọn để các bài so sánh được với nhau, không phải con số từ sách.6

Một số bài điều chỉnh con số cho hợp với sản phẩm. Ví dụ trang bán vé có lượng người dùng hằng ngày nhỏ nhưng đỉnh lúc mở bán có thể gấp 50–100 lần bình thường (ước lượng của khoá học, cần số liệu thật của sản phẩm). Khi điều chỉnh, bài luôn nói rõ lý do.

Trong phỏng vấn: câu hỏi "nếu tải tăng 10 lần thì sao" xuất hiện rất thường xuyên. Quen với ba mức này giúp bạn chỉ ra nút thắt cụ thể, ví dụ "database primary sẽ chạm 70% CPU trước", thay vì liệt kê thêm công nghệ. Grokking cũng khuyên chủ động chỉ ra điểm yếu của thiết kế, ví dụ "thiết kế hiện tại chưa chịu được tải gấp 10", và giải thích vì sao chưa xử lý.7

Muốn hiểu sâu từng mức trông thế nào, đọc Hạ tầng theo quy mô.

Cách học hiệu quả

  1. Đọc phần Bắt đầu theo thứ tự, đặc biệt Khung trả lời 45 phút.
  2. Đọc vài bài khái niệm và hạ tầng nền: Con số cần thuộc, Chọn server, Chọn database, Caching.
  3. Làm bài thiết kế trước khi đọc lời giải. Đọc phần hiểu đề, tự vẽ trên giấy 20–30 phút, sau đó mới so sánh. Grokking khuyên học khái niệm thay vì thuộc lòng một thiết kế mẫu.8
  4. Ghi lại chỗ bỏ sót. Mỗi lần thiếu một ý, tra bài khái niệm hoặc pattern liên quan.
  5. Chuyển qua lại ba mức trong bảng hạ tầng của bài. Với mỗi thành phần mới xuất hiện, tự hỏi nó giải quyết nút thắt nào, và vì sao chọn nó thay vì phương án khác.9
  6. Kiểm tra số bằng Máy tính hạ tầng.

Kế hoạch học chi tiết theo 2, 4 hoặc 8 tuần có trong bài Cách chuẩn bị.

Lưu ý về con số

Lưu ý: mọi con số về năng lực server, số instance và chi phí trong khoá đều là ước lượng thận trọng để tính nhẩm. Năng lực thật phụ thuộc code, truy vấn, kích thước dữ liệu, nhà cung cấp và cả thời điểm. Trước khi mua hạ tầng thật, hãy load test và xem bảng giá hiện hành. Grokking cũng nhấn mạnh các con số ước lượng chỉ là xấp xỉ và thay đổi rất nhiều theo loại truy vấn, cấu hình máy, thiết kế database và index.10

Khoá dùng một bộ quy tắc chung để các bài khớp nhau. Ví dụ một instance API Node.js 2 vCPU · 4 GB được tính khoảng 1.000 req/s và chỉ cho chạy tối đa 60% CPU (quy tắc ước lượng của khoá học).6 Grokking dùng con số khoảng 8.000 req/s mỗi server để tính nhẩm, lấy trung bình của 360 req/s cho request nặng CPU và 16.000 req/s cho request nặng bộ nhớ trên một máy 72 luồng CPU, 256 GB RAM.11 Khoá này cố ý chọn số thấp hơn để bảng hạ tầng gần thực tế với ứng dụng Node.js thông thường.

Bắt đầu từ đâu

Nguồn trích dẫn

  1. Grokking Modern System Design · ch.2 System Design Interviews · bài "What Is a System Design Interview?", mục "How do we tackle a design question?". ↩

  2. Grokking Modern System Design · ch.2 System Design Interviews · bài "What Is a System Design Interview?", mục "Who gets a system design interview?". ↩

  3. Grokking Modern System Design · ch.1 Introduction · mục "Who should take this course?"; và ch.2 · bài "What Is a System Design Interview?", ghi chú trong mục "How are SDIs different from other interviews?". ↩

  4. Grokking Modern System Design · ch.1 Introduction · mục "Modern system design using building blocks". ↩

  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. 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; cần load test với ứng dụng thật. ↩ ↩2

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

  8. Grokking Modern System Design · ch.1 Introduction · mục "About this course" ("A fresh look at system design"). ↩

  9. Grokking Modern System Design · ch.2 System Design Interviews · bài "How to Prepare for Success", mục "Ask why a system works". ↩

  10. Grokking Modern System Design · ch.5 Back-of-the-envelope Calculations · bài "Put Back-of-the-envelope Numbers in Perspective", mục "Important Rates". ↩

  11. Grokking Modern System Design · ch.5 Back-of-the-envelope Calculations · bài "Put Back-of-the-envelope Numbers in Perspective", mục "Requests estimation" (bảng "Typical Server Specifications" ở cùng bài). ↩

  12. Grokking Modern System Design · ch.2 System Design Interviews · bài "How to Prepare for Success" (phần mở đầu). ↩