Harbor

Tổng quan khái niệm

Bản đồ các khái niệm nền và bài hạ tầng của khoá: mỗi khái niệm một đoạn ngắn nói nó là gì, khi nào cần, kèm link tới bài chi tiết.

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

Cách dùng trang này

Trang này gom các khái niệm nền và các bài về hạ tầng vào một chỗ. Mỗi mục có một đoạn ngắn để bạn biết khái niệm đó giải quyết việc gì và xuất hiện ở đâu trong phỏng vấn. Nếu đọc xong đoạn tóm tắt mà bạn chưa giải thích lại được cho người khác, hãy mở bài chi tiết.

Thứ tự gợi ý: đi từ trên xuống. Các khái niệm phía trên được dùng lại ở các khái niệm phía dưới.

Nền tảng giao tiếp

Mạng cơ bản. DNS, TCP, TLS, HTTP/1.1 và HTTP/2, load balancer tầng 4 và tầng 7, CDN. Bạn cần biết một request đi qua những bước nào và mỗi bước tốn bao nhiêu thời gian. Ví dụ Grokking ghi round trip trong cùng data center khoảng 500 micro giây và gói tin San Francisco sang New York khoảng 71 ms; khoảng cách Việt Nam sang Mỹ còn xa hơn nên cần đo thực tế.1 Load balancer chia thành tầng 4 và tầng 7, tầng 7 xem được nội dung request nên thông minh hơn.2 Kiến thức này giúp bạn giải thích vì sao cần CDN hoặc đặt server gần người dùng.

Thiết kế API. REST, GraphQL, gRPC, phân trang bằng cursor, idempotency key, versioning, xác thực. Bước 3 của mỗi buổi phỏng vấn là viết API, nên đây là thứ bạn dùng ở mọi bài. Điểm cộng lớn nhất thường đến từ chi tiết nhỏ: userId lấy từ token, thao tác tạo đơn có idempotency key.

Lưu trữ dữ liệu

Mô hình dữ liệu. Cách chọn thực thể, quan hệ, khi nào chuẩn hoá và khi nào chấp nhận lặp dữ liệu để đọc nhanh. Mô hình dữ liệu quyết định truy vấn chính có cần join hay không, và quyết định khoá shard sau này. Cân nhắc giữa chuẩn hoá và lặp dữ liệu cũng được MongoDB bàn ở mục Normalization versus Denormalization.3 Cơ sở dữ liệu quan hệ giảm dư thừa dữ liệu, còn NoSQL có nhiều loại (key-value, document, graph, columnar).4

Database index. B-tree, hash, index phức hợp, LSM tree, index địa lý và full-text. Truy vấn không dùng index buộc server quét toàn bộ collection (table scan) và rất chậm với collection lớn.5 Khi người phỏng vấn hỏi "truy vấn này chạy nhanh thế nào", câu trả lời thường bắt đầu từ index.

Caching. Cache-aside, write-through, write-behind, TTL, invalidation, cache stampede, hot key. Cache là cách rẻ nhất để giảm tải đọc cho database. Với hệ thống đọc nhiều, tỉ lệ hit 90% nghĩa là database chỉ còn nhận 10% lượt đọc (phép tính thuần túy). Grokking phân biệt write-through, write-back và write-around theo cách ghi vào cache và database.6

Sharding. Chia dữ liệu ra nhiều node theo khoá: theo range, theo hash, theo vùng địa lý. Cần khi dữ liệu hoặc lượng ghi vượt một node. Phần khó là chọn khoá shard để tải chia đều và truy vấn chính chỉ chạm một shard.7

Consistent hashing. Cách gán key cho node sao cho khi thêm hoặc bớt node, chỉ một phần nhỏ key phải di chuyển. Điểm lợi chính là khi node vào hoặc ra, chỉ một số ít key phải di chuyển.8 Grokking nhắc tới dùng trong cache phân tán, load balancer không lưu trạng thái và key-value store kiểu Dynamo.9

CAP. Khi mạng bị chia cắt, hệ thống phải chọn giữa nhất quán và sẵn sàng; key-value store trong Grokking ưu tiên sẵn sàng.10 Trong phỏng vấn, CAP hữu ích nhất khi bạn dùng nó để nói rõ từng phần của hệ thống: số dư tài khoản cần nhất quán, số lượt like chấp nhận trễ.

Con số và ước lượng

Con số cần thuộc. Quy đổi lưu lượng theo ngày sang mỗi giây, độ trễ tham khảo, kích thước dữ liệu phổ biến, năng lực một node. Độ trễ và tốc độ tham khảo (QPS MySQL, key-value, cache) lấy từ Grokking, các quy đổi còn lại là quy tắc của khoá học.111 Đây là bộ số dùng chung cho mọi bài trong khoá. Thuộc bảng này giúp bạn ước lượng trong 3 phút và nhận ra ngay thiết kế nào không hợp lý.

Hạ tầng

Bốn bài này trả lời câu hỏi thực tế: cần bao nhiêu máy, máy loại gì, database nào, tốn khoảng bao nhiêu tiền.

Chọn server. Phân loại tải (I/O-bound, CPU-bound, memory-bound), chọn loại máy theo tỉ lệ vCPU và RAM, công thức số instance: lấy QPS đỉnh chia cho năng lực một máy nhân 0,6, tối thiểu 2 máy (quy tắc ước lượng của khoá học).11 Bài cũng hướng dẫn tính RAM cho Node.js, Postgres, Redis và Elasticsearch.

Chọn database. Bảng chọn nhanh theo nhu cầu: quan hệ và transaction dùng Postgres, ghi cực nhiều theo khoá dùng Cassandra hoặc DynamoDB, tìm kiếm dùng Elasticsearch, file dùng object storage. Mỗi lựa chọn kèm ngưỡng một node chịu được và việc cần làm khi vượt ngưỡng.

Hạ tầng theo quy mô. Mô tả ba mức Khởi đầu, Tăng trưởng, Quy mô lớn: cách triển khai, chi phí ước lượng, đội vận hành, và dấu hiệu cần chuyển mức. Đây là bài giúp bạn đọc hiểu bảng hạ tầng trong mỗi bài thiết kế.

Máy tính hạ tầng. Công cụ nhập số người dùng và thói quen sử dụng để ra số instance, RAM, cấu hình database và cache. Dùng nó để kiểm tra lại các con số bạn tự tính khi luyện bài.

Khái niệm nào xuất hiện ở bài nào

Khái niệmBài thiết kế nên luyện kèm
Caching, Database indexRút gọn link, News feed
Sharding, Consistent hashingCache phân tán, Ứng dụng chat
CAP, Mô hình dữ liệuĐặt vé sự kiện, Hệ thống thanh toán
Thiết kế APIRate limiter, Booking và tracking container
Mạng cơ bảnYouTube, Live comments

Mẹo: sau khi đọc xong phần khái niệm, chuyển sang Tổng quan pattern. Pattern là nơi các khái niệm được ghép lại thành lời giải cho từng loại vấn đề.

Nguồn trích dẫn

  1. Grokking Modern System Design · ch.5 Back-of-the-envelope Calculations · bài "Put Back-of-the-envelope Numbers in Perspective", mục "Standard numbers to remember" (bảng Important Latencies và Important Rates). ↩ ↩2

  2. Grokking Modern System Design · ch.8 Load Balancers · bài "Types of load balancers" (Layer 4 và Layer 7). ↩

  3. MongoDB: The Definitive Guide 2e (file .zip, tải về giải nén) · ch.8 Application Design · mục "Normalization versus Denormalization". ↩

  4. Grokking Modern System Design · ch.9 Databases · bài về cơ sở dữ liệu quan hệ và NoSQL, mục "Why relational databases?" và "Types of NoSQL databases". ↩

  5. MongoDB: The Definitive Guide 2e (file .zip, tải về giải nén) · ch.5 Indexing · mục "Introduction to Indexing". ↩

  6. Grokking Modern System Design · ch.16 Distributed Cache · mục "Writing policies". ↩

  7. Grokking Modern System Design · ch.9 Databases · bài về partitioning, mục "Sharding" (key-range, hash-based, consistent hashing). ↩

  8. Grokking Modern System Design · ch.10 Key-value Store · bài "Design of a Key-value Store", mục "Consistent hashing". ↩

  9. Grokking Modern System Design · ch.16 Distributed Cache · phần chọn cache server bằng consistent hashing; ch.8 Load Balancers · mục "Stateless load balancing". ↩

  10. Grokking Modern System Design · ch.10 Key-value Store · phần bàn về CAP theorem và replication. ↩

  11. 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