Bỏ qua điều hướng

Khóa họcArchitecture

Thiết kế hệ thống - ước lượng tải, load balancer, cache, queue, replication và partitioning

System design foundations: requirements and constraints, SLOs and error budgets, workload and back-of-the-envelope estimates, load balancers, caches, queues, read replicas, partitioning, object storage and CDN, bottlenecks, failure propagation and recorded design decisions

Fig. 01Thiết kế hệ thống - ước lượng tải, load balancer, cache, queue, replication và partitioning

Khoá học nền về thiết kế hệ thống, đi từ requirement, tải cao điểm và constraint tới kiến trúc. Bạn ước lượng dung lượng, băng thông và số instance, rồi chọn cache, queue, replica hay partition cho đúng workload, tìm bottleneck và so sánh phương án. Mỗi thành phần thêm vào đều gắn với một triệu chứng đo được.

  • 24 bài
  • 7h35p
  • 11 quiz
  • 3 bài học thử miễn phí
  • 47 học viên

Bạn sẽ làm được gì

Hệ thống của bạn cần những thành phần nào, và cần thêm từ lúc nào? Developer backend nào cũng gặp câu hỏi này khi sản phẩm bắt đầu có người dùng thật. Câu trả lời nằm ở requirement, tải cao điểm và constraint của chính hệ thống đó, nên khoá học đi từ những đầu vào này tới kiến trúc, rồi tới cách tìm bottleneck và so sánh phương án.

  1. Viết requirement bằng số liệu — Bạn phân biệt functional requirement, non-functional requirement và constraint, rồi biến những yêu cầu chung chung về tốc độ và độ ổn định thành số liệu đo được: SLO, error budget, RPO và RTO.
  2. Ước lượng trước khi dựng hệ thống — Từ tải cao điểm theo từng phút, tỉ lệ đọc/ghi và payload, bạn ước lượng nhanh dung lượng lưu trữ, băng thông và số instance cần chạy, chừa headroom và ghi rõ từng giả định để sau này đối chiếu với metric thật.
  3. Chỉ định nơi giữ dữ liệu gốc — Bạn chọn source of truth cho từng loại dữ liệu và bảo đảm cache, search index hay bảng báo cáo đều dựng lại được từ đó.
  4. Chọn thành phần theo triệu chứng đo được — Với load balancer, cache, queue, read replica, partition, object storage và CDN, bạn biết lúc nào cần đến từng thành phần, nó cải thiện được số liệu nào và đi kèm tradeoff gì.
  5. Tìm bottleneck trước khi thêm máy — Bạn xem utilization, saturation và errors ở từng chặng trên request path để tìm tài nguyên bão hòa sớm nhất, rồi chỉ ra lỗi ở một thành phần sẽ lan ra những đâu.
  6. So sánh phương án và ghi lại quyết định — Bạn thiết lập hai phương án từ cùng một đầu vào thiết kế, so sánh theo latency, chi phí mỗi tháng, số thành phần phải vận hành và failure mode, rồi ghi quyết định cùng phương án bị loại vào ADR (Architecture Decision Record, bản ghi quyết định kiến trúc).

Trọng tâm là nhận ra lúc nào hệ thống cần thêm một thành phần và ước lượng thành phần đó cải thiện được bao nhiêu; cách cấu hình từng công cụ nằm ngoài phạm vi. Ví dụ trong bài dùng Postgres, Redis và một cửa hàng online nhỏ, còn phép tính và cách chọn thì không phụ thuộc vào ngôn ngữ, framework hay nhà cung cấp cloud bạn đang dùng.

Xem bản Markdown

Bạn có đang gặp những dấu hiệu này?

  • Tăng số instance của app từ 3 lên 6, throughput vẫn giữ ở 1.200 request/giây còn p99 tăng từ 180 ms lên 650 msCPU của Postgres primary đã gần chạm giới hạn, nên thêm instance app chỉ dồn thêm truy vấn vào đúng chặng đang bão hòa.
  • Dashboard báo trung bình 40 request/giây nhưng nginx trả 502 lúc 20:00 mỗi tốiSố trung bình theo ngày che mất 3 phút tải tăng lên 900 request/giây sau mỗi lần gửi push notification khuyến mãi, gấp ba mức app chịu được.
  • Benchmark đạt 2.000 request/giây nên một instance được coi là dư sức cho 500 request/giâyBenchmark đo trên /health với 5 ms mỗi request, còn API chat mất 80 ms nên mỗi instance chỉ chịu khoảng 125 request/giây.
Xem đủ 7 dấu hiệu và vì sao có khóa học này

Khóa học này có hợp với bạn?

Khoá học dành cho ai

  1. Developer backendPhù hợp nhất— Bạn đã đưa lên production một ứng dụng web có database phía sau, và giờ phải trả lời những câu hỏi như có cần cache không, cần mấy instance, hệ thống có chịu nổi đợt khuyến mãi tới không.
  2. Người viết đề xuất kiến trúc cho team— Bạn là tech lead hoặc developer được giao chọn giữa các phương án thiết kế, và cần so sánh chúng bằng số liệu rồi ghi lại quyết định cho người vào team sau.
  3. Developer vận hành một hệ thống đang lớn dần— Bạn phụ trách một app có tải, dữ liệu và hóa đơn hạ tầng tăng theo từng tháng, và cần biết triệu chứng nào báo hiệu đã tới lúc thêm thành phần, thành phần nào vẫn chưa cần.

Những điều cần lưu ý

  1. Không đi vào cách từng thành phần hoạt động bên trong — Cache invalidation, consistency model của replica hay delivery semantics của queue nằm ngoài khoá học; mỗi bài dừng ở mức đủ để bạn quyết định có thêm thành phần đó hay chưa.
  2. Không có bước cài đặt hay cấu hình — Khoá học không đi vào Kubernetes, cách phân loại load balancer theo tầng mạng (L4/L7) hay cách cấu hình một nhà cung cấp cloud cụ thể; bạn có phép tính và tiêu chí để quyết định trước khi mở bất kỳ trang cấu hình nào.
  3. Số liệu trong bài là số minh họa — Các ví dụ dùng số tự đặt để các phép tính khớp với nhau, không phải sức chịu tải chung của Postgres hay Redis; bạn học cách lập phép tính kèm giả định, rồi thay bằng số đo từ hệ thống của mình.
  4. Demo kit không bắt buộc — Mọi bài đều đọc hiểu được mà không cần chạy Docker; kit dành cho lúc bạn muốn tận mắt thấy p99 tăng vọt trên máy mình rồi giảm xuống sau khi áp dụng cách xử lý.

Bạn sẽ học theo cách nào

  1. Bắt đầu từ triệu chứng thật— Bài nào cũng mở bằng một dashboard, một đoạn log hay một hóa đơn cloud có số liệu cụ thể; thành phần hay khái niệm chỉ xuất hiện khi bạn đã thấy nó giải quyết triệu chứng nào.
  2. Phép tính kèm hình vẽ— Các phép tính đều ghi rõ đơn vị và giả định, còn ảnh minh họa vẽ request path, chỗ giữ state, chặng bão hòa và thành phần được thêm vào sau khi sửa.
  3. Quiz ở các bài cần tính toán— Các bài về cách đọc dashboard, workload, ước lượng, sáu thành phần, bottleneck và cách lỗi lan ra có quiz ngắn, trong đó nhiều câu yêu cầu bạn làm phép tính trước khi chọn đáp án.
  4. Áp dụng cho hệ thống của bạn— Phần lớn các bài khép lại bằng một bài tập trên hệ thống bạn đang có: vẽ request path, lập bảng constraint, viết hai dòng SLO hay một ADR.
  5. Ba demo kit chạy bằng Docker— Mỗi bài tình huống kèm một kit để coding agent của bạn dựng lại hệ thống trên laptop, chạy k6 ở mức tải cố định và cho bạn thấy triệu chứng của bài; khi bạn yêu cầu, agent áp dụng cách xử lý mà bài trình bày rồi chạy lại cùng kịch bản để so sánh.

Mentor

Bắt đầu từ đâu

Bài mở đầu đặt hai bản thiết kế cạnh nhau. Bản thứ nhất có bảy thành phần cho một cửa hàng chỉ nhận 30 request/giây lúc cao điểm; bản thứ hai chỉ có một app và một Postgres, và Postgres quá tải trong đêm khuyến mãi khi tải tăng lên 2.000 request/giây. Bài chỉ ra cách biết một bản thiết kế đang thừa hay thiếu so với tải cao điểm, và vì sao hai bản ngược nhau lại sai ở cùng một chỗ: cả hai được vẽ khi đầu vào thiết kế còn chưa được ghi lại. Từ bài này trở đi, đầu vào thiết kế là điểm xuất phát của mọi quyết định.

Học thử bài đầu tiên