Các kỹ thuật xử lý
Các kỹ thuật và patterns phổ biến để giải quyết vấn đề trong system design.
1. Sharding (Partitioning)
Chia database thành các shard nhỏ hơn dựa trên shard key.
Sharding strategies
- Range‑based: Chia theo khoảng giá trị (A-M, N-Z).
- Hash‑based: Dùng hash function để map vào shard.
- Directory‑based: Lookup table để map key → shard.
Challenges
- Hotspots: Một shard nhận nhiều traffic hơn.
- Cross‑shard queries: Query dữ liệu từ nhiều shard phức tạp.
- Re‑sharding: Khó khăn khi cần thay đổi shard strategy.
2. Replication
Sao chép dữ liệu sang nhiều nodes để tăng availability và reliability.
Replication patterns
- Master‑Slave: Chỉ master nhận writes, slaves phục vụ reads.
- Multi‑Master: Nhiều node có thể write, cần conflict resolution.
- Masterless: Mọi node đều ngang hàng (Cassandra).
Sync vs Async replication
- Sync: Strong consistency, higher latency.
- Async: Eventual consistency, lower latency.
3. Consistency Models
Strong consistency
Mọi read nhận được write mới nhất. Phù hợp cho financial transactions.
Eventual consistency
Sau một thời gian, tất cả replicas sẽ converge. Phù hợp cho social media, comments.
CAP theorem
Trong distributed system, chỉ có thể đảm bảo hai trong ba:
- Consistency: Mọi node thấy cùng một data tại cùng một thời điểm.
- Availability: Mọi request nhận được response (không guarantee là latest).
- Partition tolerance: Hệ thống vẫn hoạt động khi có network partition.
4. Rate Limiting
Giới hạn số request từ một client để bảo vệ hệ thống.
Algorithms
- Token bucket: Tokens được thêm vào bucket với rate cố định.
- Leaky bucket: Requests được xử lý với rate cố định.
- Fixed window: Giới hạn số request trong một khoảng thời gian cố định.
- Sliding window: Giới hạn số request trong khoảng thời gian sliding.
Implementation
- API Gateway level.
- Middleware/Service level.
- Distributed rate limiting với Redis.
5. Idempotency
Đảm bảo thực hiện một operation nhiều lần mà kết quả không thay đổi.
Techniques
- Unique request ID: Client gửi ID, server check nếu đã xử lý thì return kết quả cũ.
- Idempotent API design:
PUT /users/123luôn update cùng một trạng thái. - Database constraints: Unique key để tránh duplicate.
Use cases
- Payment processing (tránh double charge).
- Order creation.
- Form submissions.
6. Circuit Breaker
Ngăn hệ thống gọi service đang fail liên tục.
States
- Closed: Bình thường, calls được thực hiện.
- Open: Service đang fail, calls bị chặn ngay lập tức.
- Half‑Open: Thử một vài calls để check service đã recovery chưa.
Implementation
- C#: Polly library.
- Java: Hystrix, Resilience4j.
- Go: gobreaker.