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ượngKế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

  1. Sơ đồ gồm: load balancer, tầng API (bao nhiêu máy, vì sao), cache, cơ sở dữ liệu.
  2. Luồng ghi và luồng đọc, đánh số từng bước.
  3. 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.
  4. 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)

  1. 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: ...
  1. 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).
  2. 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).
  3. 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

  1. Vẽ trước hay hỏi tải trước?
  2. Cân bằng tải để làm gì?
  3. Sharding chia theo gì?
  4. 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.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.