+3

8 vấn đề phổ biến trong System Design và cách giải quyết (dành cho Developer)

Trong bài này, bạn sẽ học:

  • Các vấn đề phổ biến khi xây dựng hệ thống lớn.
  • Giải pháp cụ thể cho từng vấn đề.
  • Use case thực tế giúp bạn hiểu và áp dụng.

image.png


1️⃣ Dùng Caching để tăng tốc độ đọc (Read-heavy)

Vấn đề: Nếu hệ thống có lượng đọc cao (ví dụ: website thương mại điện tử), truy vấn DB liên tục gây quá tải, tăng latency.

Giải pháp: Dùng cache (Redis, Memcached) lưu các dữ liệu truy vấn phổ biến. Khi người dùng yêu cầu:

  • Nếu cache có ⇒ trả kết quả ngay (nhanh).
  • Nếu cache không có ⇒ đọc DB, đồng thời lưu vào cache cho lần sau.

Use case thực tế: Website bán hàng (Shopee, Tiki):

  • Sản phẩm bán chạy (iPhone 15) có hàng triệu lượt xem/ngày.
  • Thay vì query database SELECT * FROM products WHERE id=15 mỗi lần, cache chi tiết sản phẩm vào Redis.

Code sample (Python + Redis)

# Redis cache example
import redis
db = redis.Redis()

product_id = "15"
cached = db.get(product_id)

if cached:
    print("Cache hit:", cached)
else:
    result = query_product_from_db(product_id)
    db.set(product_id, result, ex=3600)  # Cache for 1 hour

2️⃣ Dùng Async WriteLSM-Tree DB cho High-write traffic

Vấn đề: App có lưu lượng ghi cao (ví dụ: app chat, mạng xã hội). Database bị nghẽn do phải ghi đồng bộ.

Giải pháp:

  • Xử lý ghi bất đồng bộ (queue worker như Kafka, RabbitMQ).
  • Dùng database tối ưu ghi như LSM Tree DB (Cassandra, RocksDB).

Use case thực tế: App chat (Zalo, Telegram): mỗi giây hàng ngàn tin nhắn.

  • Tin nhắn đẩy vào queue.
  • Worker ghi batch vào DB.

3️⃣ Redundancy và Failover (Tính sẵn sàng cao)

Vấn đề: Hệ thống chỉ có 1 server (Single Point of Failure). Server die = mất dịch vụ.

Giải pháp: Triển khai replication + failover.

  • Master ↔ Replica
  • Khi master die, failover tự động chuyển sang replica.

Use case thực tế: Website ngân hàng (MB Bank, Vietcombank):

  • Database master-replica.
  • Khi primary die, app chuyển qua replica, tránh downtime.

4️⃣ Dùng Load Balancer để phân phối tải

Vấn đề: Khi traffic cao (ví dụ Black Friday), 1 server chịu không nổi.

Giải pháp: Dùng Load Balancer (Nginx, AWS ALB):

  • Phân phối request qua nhiều server.
  • Nếu 1 server die, request tự chuyển server khác.

Use case thực tế: Trang web Tiki vào 11/11:

  • Có thể scale lên 10 app server.
  • Load balancer phân phối đều.

5️⃣ Dùng CDN để giảm latency

Vấn đề: Người dùng ở xa server chính ⇒ load image/video chậm.

Giải pháp: Dùng CDN (Cloudflare, AWS CloudFront):

  • Lưu trữ file tĩnh gần người dùng.
  • Giảm latency, giảm tải server chính.

Use case thực tế: Web tin tức VnExpress có người dùng toàn cầu.

  • CDN cache ảnh, video gần US, EU, Asia.

6️⃣ Dùng Block StorageObject Storage cho file lớn

Vấn đề: Lưu file lớn (video, hình ảnh, PDF) trên database làm DB nặng.

Giải pháp:

  • Dùng Block Storage (EBS).
  • Dùng Object Storage (S3).

Use case thực tế: App học online (Khan Academy):

  • Video bài giảng lưu trên AWS S3.
  • Metadata (title, description) lưu DB.

7️⃣ Dùng Centralized Logging (Log tập trung)

Vấn đề: Nhiều server, khó tìm log lỗi.

Giải pháp: Dùng bộ ELK (Elasticsearch, Logstash, Kibana):

  • Tập trung log từ nhiều server.
  • Có dashboard dễ tìm kiếm lỗi.

Use case thực tế: Hệ thống microservice (ShopeePay):

  • Mỗi service push log vào ELK stack.
  • DevOps search log dễ dàng.

8️⃣ Dùng Sharding + Index để tăng tốc query

Vấn đề: Database lớn (hàng tỷ bản ghi) ⇒ query chậm.

Giải pháp:

  • Tạo Index cho trường hay query.
  • Dùng Sharding chia DB ra nhiều node.

Use case thực tế: Hệ thống phân tích click (Google Analytics clone):

  • Dữ liệu click của từng website shard theo website_id.
  • Index trường timestamp, user_id.

SQL Index Example

CREATE INDEX idx_user_timestamp
ON clicks (user_id, timestamp);

Tổng kết

Vấn đề Giải pháp
Đọc nhiều Cache
Ghi nhiều Async Write + LSM-Tree
Server die Replication + Failover
Quá tải server Load Balancer
Người dùng xa CDN
File lớn Object Storage
Nhiều log ELK
DB chậm Index + Sharding


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.