System design cơ bản: scale, ELB và sharding
Thực hành system design nghề nghiệp: ước lượng tải, cân bằng tải, sharding, cache tầng và trình bày trước hội đồng.
Chuyên giaCấu trúc dữ liệu ~90 phút
Ôn lại trước khi học
Giới thiệu
Bạn thiết kế hệ thống đọc nhiều. Tải đỉnh gấp mười trung bình.
Kiến thức cần nhớ
Ước lượng tải
- Hỏi yêu cầu trước khi vẽ bất cứ gì.
- Ước lượng bộ nhớ, băng thông, số nút.
- Ví dụ đời thường: giống hỏi số mâm trước khi nấu cỗ.
- Mọi con số phải ghi giả định kèm theo.
Cân bằng tải và cache tầng
- Cân bằng tải chia request cho nhiều máy.
- Cache tầng giữ dữ liệu hot gần người dùng.
- Ví dụ đời thường: giống mở nhiều quầy thu ngân giờ cao điểm.
- Tải đỉnh gấp mười cần phương án hấp thụ cụ thể.
Sharding và chịu lỗi
- Sharding chia dữ liệu theo key ra nhiều shard.
- Key nóng cần cách xử lý riêng.
- Ví dụ đời thường: giống chia kho theo mã hàng.
- Thêm nút thì ghi rõ dữ liệu di chuyển thế nào.
# chia shard đơn giản
def shard(key, n):
return hash(key) % n # key nào về shard đó
print(shard("user1", 4)) # in số shard chứa key
Ví dụ
- Tải đỉnh gấp mười -> có phương án hấp thụ cụ thể.
- 3 key mẫu gồm key nóng -> chỉ rõ shard chứa và cách xử lý.
💻 Bài tập
Thiết kế trên giấy hoặc Markdown, kèm 1 phần code nhỏ ở Bài 3. Nộp vào day-175/.
Bài 1: Ước lượng tải
Đề: dịch vụ rút gọn link (kiểu bit.ly). 100 triệu link mới mỗi tháng, tỉ lệ đọc/ghi 100:1, lưu 5 năm.
Tính và ghi rõ giả định:
| Đại lượng | Kết quả |
|---|---|
| Ghi mỗi giây (trung bình và đỉnh gấp 10) | ... |
| Đọc mỗi giây | ... |
| Dung lượng lưu 5 năm (mỗi bản ghi ~500 byte) | ... |
| Độ dài mã rút gọn cần thiết (base62) | ... |
| Băng thông đọc | ... |
| Bộ nhớ cache cho 20% link nóng mỗi ngày | ... |
Bài 2: Sơ đồ triển khai
- Sơ đồ gồm: load balancer, tầng API (bao nhiêu máy, vì sao), cache, cơ sở dữ liệu.
- Luồng ghi và luồng đọc, đánh số từng bước.
- Sinh mã rút gọn: so 3 cách (băm rồi cắt, bộ đếm tăng dần + base62, ID ngẫu nhiên). Xử lý trùng.
- Tải đỉnh gấp 10: phương án hấp thụ cụ thể (tự mở rộng, hàng đợi ghi, cache).
Bài 3: Sharding và key nóng (nâng cao)
- Viết code nhỏ consistent hashing có virtual node (100 virtual node mỗi máy):
class HashRing:
def add_node(self, node: str): ...
def remove_node(self, node: str): ...
def get_node(self, key: str) -> str: ...
- Với 10^6 key và 4 máy, in số key mỗi máy. Thêm máy thứ 5: in tỉ lệ key phải di chuyển (kỳ vọng khoảng 1/5). So với
hash(key) % n(kỳ vọng khoảng 4/5). - 1 link viral nhận 30% lưu lượng đọc: phương án xử lý (cache nhiều tầng, nhân bản key nóng).
- Trình bày 10 phút cho 1 người nghe, ghi lại câu hỏi.
✅ Tiêu chí hoàn thành
- Bảng ước lượng có công thức và giả định.
- Sơ đồ có luồng đọc/ghi đánh số.
- Code consistent hashing có số liệu di chuyển key so với modulo.
- Có phương án cho tải đỉnh và key nóng.
❓ Câu hỏi ôn tập
- Vẽ trước hay hỏi tải trước?
- Cân bằng tải để làm gì?
- Sharding chia theo gì?
- Key nóng xử lý thế nào?
🌕 Bạn đã hoàn thành ngày 175. Làm hết bài tập phía trên rồi sang ngày tiếp theo.