System Design Primer
Lộ trình thiết kế hệ thống phân tán quy mô lớn và luyện phỏng vấn kiến trúc chuẩn donnemartin/system-design-primer (55k+ ★)
Hướng dẫn toàn diện từ nền tảng đến chuyên sâu về kiến trúc hệ thống phục vụ hàng trăm triệu người dùng. Bao quát nguyên lý mở rộng, lưu trữ phân tán, bộ nhớ đệm, tính toán độ trễ, và các case study kinh điển như Twitter, Pastebin, Web Crawler, AWS scaling.
Bảng Độ Trễ Phần Cứng & Tính Toán Phỏng Vấn (System Calculations)
Các con số cốt lõi mọi kỹ sư thiết kế hệ thống cần ghi nhớ theo tài liệu của Jeff Dean (Google) và Colin Scott.
| Thao tác phần cứng / Mạng | Độ trễ thực tế | Quy đổi tỷ lệ (Nếu 1ns = 1s) | Phân loại |
|---|---|---|---|
| L1 Cache Reference | 0.5 ns | 0.5 giây | cpu |
| Branch Mispredict | 5 ns | 5 giây | cpu |
| L2 Cache Reference | 7 ns | 7 giây | cpu |
| Mutex Lock / Unlock | 25 ns | 25 giây | cpu |
| Main Memory (RAM) Access | 100 ns | 1.7 phút | memory |
| Compress 1KB với Zippy | 10 µs | 2.8 giờ | cpu |
| Gửi 2KB qua mạng 1Gbps | 20 µs | 5.5 giờ | network |
| Đọc ngẫu nhiên từ NVMe SSD | 150 µs | 1.7 ngày | storage |
| Đọc 1MB tuần tự từ RAM | 250 µs | 2.9 ngày | memory |
| Round trip cùng Datacenter | 500 µs (0.5 ms) | 5.8 ngày | network |
| Đọc 1MB tuần tự từ NVMe SSD | 1,000 µs (1 ms) | 11.6 ngày | storage |
| Disk Seek (Quay đĩa cơ HDD) | 10 ms | 16.5 tuần (~4 tháng) | storage |
| Đọc 1MB tuần tự từ đĩa HDD | 20 ms | 7.8 tháng | storage |
| Gói tin đi-về xuyên đại dương (CA -> Hà Lan) | 150 ms | 4.8 năm! | network |
Case Studies Thực Chiến & Thiết Kế Lõi Hệ Thống
Khám phá 8 bài toán kiến trúc phân tán quy mô lớn và 6 thiết kế hướng đối tượng kinh điển kèm sơ đồ luồng & mã nguồn chuẩn.
Thiết Kế Dịch Vụ Rút Gọn Link & Lưu Văn Bản (Pastebin / Bit.ly)
Thiết kế hệ thống rút gọn URL và lưu trữ khối văn bản có thời hạn (TTL). Giải quyết bài toán sinh shortlink 7 ký tự Base62 không trùng lặp, đọc dữ liệu cực nhanh với Redis cache và lưu trữ hàng tỷ bản ghi trên Object Storage (S3) kết hợp RDBMS/NoSQL.


# -*- coding: utf-8 -*-
from mrjob.job import MRJob
class HitCounts(MRJob):
def extract_url(self, line):
"""Extract the generated url from the log line."""
pass
def extract_year_month(self, line):
"""Return the year and month portions of the timestamp."""
pass
def mapper(self, _, line):
"""Parse each log line, extract and transform relevant lines.
Emit key value pairs of the form:
(2016-01, url0), 1
(2016-01, url0), 1
(2016-01, url1), 1
"""
url = self.extract_url(line)
period = self.extract_year_month(line)
yield (period, url), 1
def reducer(self, key, values):
"""Sum values for each key.
(2016-01, url0), 2
(2016-01, url1), 1
"""
yield key, sum(values)
def steps(self):
"""Run the map and reduce steps."""
return [
self.mr(mapper=self.mapper,
reducer=self.reducer)
]
if __name__ == '__main__':
HitCounts.run()