Theo system-design-primer · cho người đi làm

Lộ trình System Design

Mục tiêu là nắm chắc nền tảng để không bị tụt hậu, không phải luyện thi. Mỗi tuần 2 buổi, mỗi buổi khoảng 45 phút. Tuần chỉ là thứ tự: tuần nào bận thì dời, không cần đuổi kịp.

Ít thời gian thì chỉ làm việc ★ Trọng tâm. Dòng Thêm ở mỗi tuần là phần làm khi có thời gian, bỏ qua không ảnh hưởng tuần sau.

Nhịp mỗi tuần · khoảng 1,5 giờ

Buổi 1: đọc45′
Buổi 2: đọc tiếp, tự viết lại ý chính45′
Thêm: DDIA, đối chiếu PRE, Ankikhi rảnh
Đã xong 0/0 việc · Trọng tâm 0/0

Lộ trình

Mỗi tuần ghi chủ đề theo mức độ quan trọng và điều cần nói được khi xong. Bấm vào tuần để xem từng buổi.

★ Trọng tâm

Phải tự giải thích được bằng lời, kèm trade-off. Dùng thường xuyên khi thiết kế và review.

Nên biết

Hiểu khi nào dùng và khi nào không. Không cần nói sâu.

Đọc lướt

Biết tên và ý chính là đủ. Thiếu thời gian thì bỏ.

PREDDIAClaude

Đối chiếu dự án · đọc lại chương sách khi chưa rõ · nhờ Claude hỏi lại.

Giai đoạn 1 · Nền tảng (tuần 1–8)

Giai đoạn 2 · Luyện áp dụng (tuần 9–12)

Từng buổi

Tick vào ô khi xong. Đánh dấu chỉ lưu trong trình duyệt đang dùng.

Tuần 1Scale và consistency
Cần nói được
  • Chậm với 1 user là vấn đề performance. Nhanh với 1 user nhưng chậm khi đông là vấn đề scalability.
  • Khi mạng bị chia cắt, hệ thống phải chọn: trả lỗi để giữ dữ liệu đúng (CP), hay trả dữ liệu có thể cũ để vẫn phục vụ (AP).
  • Availability 99.9% là khoảng 8.8 giờ ngừng mỗi năm, 99.99% là khoảng 53 phút.

Lưu ý: primer chỉ nói CAP ở mức khái niệm. DDIA Ch. 9 giải thích vì sao CAP hay bị hiểu sai.

BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 2Đường đi của một request
Cần nói được
  • Load balancer L4 chia theo IP và port. L7 đọc được HTTP nên chia theo path, header, cookie.
  • Muốn scale ngang thì service phải stateless: session để ở Redis hoặc DB, không để trong RAM của từng máy.
  • CDN kiểu pull: lần đầu lấy từ gốc, sau đó lấy từ cache. Kiểu push: tự đẩy file lên khi nội dung đổi.
BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 3Database: mở rộng
Cần nói được
  • Thứ tự mở rộng: tối ưu query và index → cache → read replica → tách DB theo chức năng → sharding.
  • Read replica chỉ giảm tải đọc, không giảm tải ghi. Giá phải trả là replication lag: vừa ghi xong đọc lại có thể thấy dữ liệu cũ.
  • Sharding là bước cuối: join và transaction giữa các shard rất khó. Chọn shard key sai thì một shard bị quá tải.
BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 4Database: chọn loại
Cần nói được
  • Mặc định chọn SQL. Chọn NoSQL khi cần ghi cực lớn, dữ liệu không có quan hệ rõ, hoặc schema thay đổi liên tục.
  • Key-value cho tra cứu nhanh theo khóa, document cho dữ liệu dạng cây, wide column cho ghi cực lớn theo thời gian, graph cho quan hệ nhiều tầng.

Lưu ý: DDIA Ch. 7 Transactions (isolation level) rất đáng đọc cho dev backend, primer không nói tới.

BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 5Cache
Cần nói được
  • Cache-aside phổ biến nhất: đọc cache, không có thì đọc DB rồi ghi vào cache. Rủi ro: dữ liệu cũ, và nhiều request cùng trượt cache một lúc đổ dồn vào DB.
  • Xóa cache đúng lúc là phần khó nhất. Luôn đặt TTL.
  • Write-through giữ cache luôn mới nhưng ghi chậm hơn. Write-behind ghi nhanh nhưng có thể mất dữ liệu nếu cache sập.

Lưu ý: gần với việc đang làm nhất (FusionCache), nên tận dụng phần đối chiếu PRE.

BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 6Xử lý bất đồng bộ
Cần nói được
  • Queue giúp trả lời nhanh và chịu được đỉnh tải. Giá phải trả: phải xử lý retry, message trùng (idempotency), thứ tự message.
  • Back pressure: khi queue đầy thì từ chối sớm (trả 429 hoặc 503) thay vì để hệ thống chậm dần rồi sập.
BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 7Ước lượng và giao tiếp
Cần nói được
  • 1 ngày ≈ 86.400 giây ≈ 10⁵ giây. Vậy 1 triệu request mỗi ngày ≈ 12 request mỗi giây. QPS đỉnh thường gấp 2–3 lần trung bình.
  • Đọc từ RAM nhanh hơn đọc qua mạng hoặc từ đĩa hàng nghìn lần. Đó là lý do cache tồn tại.

Lưu ý: phần Security và TCP/UDP của primer rất cơ bản, đọc lướt là đủ.

BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 8Ôn và bù
Cần làm được
  • Trả lời không nhìn tài liệu phần "Cần nói được" của tuần 1–7.

Lưu ý: tuần này để trống có chủ đích. Bận thì dùng để bù buổi bị lỡ.

BuổiPhútViệc
Buổi 145′
Buổi 245′
Tuần 9Khung thiết kế
Cần làm được
  • Hỏi lại yêu cầu và ước lượng tải trước khi vẽ bất cứ thứ gì.
  • Vẽ bản đơn giản chạy được trước, rồi mới mở rộng. Mỗi lựa chọn nói kèm một trade-off.

Lưu ý: khung 4 bước dùng được luôn khi review thiết kế của team.

BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 10Mở rộng trên AWS
Cần làm được
  • Đi từ 1 máy lên hàng triệu user theo từng bước, mỗi bước giải quyết đúng một điểm nghẽn.
  • Chỉ ra được dự án đang ở bước nào và bước tiếp theo là gì.
BuổiPhútViệc
Buổi 145′
Buổi 245′
Tuần 11Đọc nhiều, ghi nhiều
Cần nói được
  • Fan-out on write: tính sẵn timeline khi có bài mới. Đọc nhanh, nhưng tốn khi người có hàng triệu follower đăng bài.
  • Fan-out on read: ghép timeline lúc đọc. Ghi rẻ, đọc chậm. Hệ thống thật kết hợp cả hai.
BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—
Tuần 12Tự chọn và tổng kết
Cần làm được
  • Chọn 2–3 chủ đề mới ở mục Tài liệu để học tiếp theo cùng nhịp này.
BuổiPhútViệc
Buổi 145′
Buổi 245′
Thêm—

Luyện áp dụng

Tự thiết kế trên giấy trước, rồi mới đọc lời giải. Khung này dùng được luôn khi review thiết kế của team.

Khung 4 bước

  1. Use case và ràng buộc: ai dùng, bao nhiêu user, đọc nhiều hay ghi nhiều. Ước lượng QPS và dung lượng.
  2. Thiết kế tổng thể: các thành phần chính và luồng dữ liệu.
  3. Thiết kế chi tiết: API, schema, thuật toán cốt lõi.
  4. Mở rộng: tìm điểm nghẽn, thêm cache, replica, shard, queue. Nói rõ trade-off.

Sau mỗi bài, ghi 3 dòng

  • Mình bỏ sót thành phần hay yêu cầu nào?
  • Ước lượng sai ở đâu, sai bao nhiêu lần?
  • Trade-off nào mình chưa nghĩ tới?

Muốn có người hỏi vặn: nói với Claude "hỏi vặn thiết kế X của tôi".

Tài liệu

Đọc gì

  • system-design-primer: luồng chính. Đây là bản đồ, mỗi chủ đề chỉ vài đoạn.
  • Designing Data-Intensive Applications: đọc lại chương có thẻ DDIA khi chưa rõ. Bản 2 (Kleppmann, Riccomini) ra tháng 2/2026, số chương có thể khác bản 1.
  • System Design Interview của Alex Xu: không bắt buộc, vì sách nhắm tới phỏng vấn.
  • Anki: bộ thẻ ở resources/flash_cards, ôn 5–10′ khi rảnh trên Boox.

Học tiếp sau 12 tuần

Primer viết từ vài năm trước nên thiếu các chủ đề dưới đây. Đây là phần giúp không bị tụt hậu.

  • Outbox, saga: ghi DB và gửi message cùng thành công
  • Event streaming kiểu Kafka, khác SQS ở đâu
  • Observability: log, metric, trace với OpenTelemetry
  • Rate limiting, idempotency key cho API
  • Hệ thống dùng LLM: vector search, RAG, cache câu trả lời