Tổng quan pattern
Bảy pattern lặp lại ở hầu hết bài system design: mỗi pattern giải quyết vấn đề gì, dấu hiệu nhận ra trong đề, và những bài thiết kế dùng tới nó.
Vì sao học theo pattern
Đề phỏng vấn rất đa dạng, nhưng phần khó của chúng lặp lại. Bài đặt vé và bài flash sale khác sản phẩm nhưng cùng một vấn đề: nhiều người tranh một tài nguyên có hạn. Bài chat và bài live comments cùng cần đẩy dữ liệu tới client ngay khi có thay đổi.
Nắm bảy pattern dưới đây, bạn sẽ nhận ra phần lớn vấn đề cần đào sâu ngay khi đọc đề. Bước 5 trong Khung trả lời 45 phút gần như luôn rơi vào một hoặc hai pattern này.
Bảng tổng hợp
| Pattern | Vấn đề giải quyết | Dấu hiệu trong đề | Bài dùng nhiều |
|---|---|---|---|
| Scale đọc | Lượt đọc vượt khả năng database | Đọc gấp 10–100 lần ghi, nội dung được xem lại nhiều | Rút gọn link, News feed, Yelp |
| Scale ghi | Lượt ghi vượt một node | Sự kiện, click, vị trí gửi liên tục | Ad click aggregator, Giám sát metric, Top K |
| Tranh chấp tài nguyên | Không bán trùng, không vượt kho | Số lượng có hạn, mở bán theo giờ | Đặt vé sự kiện, Flash sale, Đấu giá online |
| Cập nhật realtime | Client thấy thay đổi trong vài trăm ms | "Ngay lập tức", trạng thái online | Ứng dụng chat, Live comments, Cờ vua online |
| Tác vụ dài | Việc mất vài giây đến vài giờ | Encode, tạo báo cáo, gửi hàng loạt | YouTube, Job scheduler, Web crawler |
| File lớn | Upload, lưu, phát file MB đến GB | Ảnh, video, tài liệu, đồng bộ file | Dropbox, YouTube, Instagram |
| Quy trình nhiều bước | Nhiều service phải cùng thành công hoặc bù trừ | Thanh toán, đặt hàng, đối tác bên ngoài | Hệ thống thanh toán, Giao hàng nội thành, Booking và tracking container |
Scale đọc
Khi đọc nhiều hơn ghi rất nhiều, database chính trở thành nút thắt. Lời giải đi từ đơn giản tới phức tạp: index đúng, cache-aside với Redis, read replica, CDN cho nội dung tĩnh, rồi tính trước kết quả (như feed dựng sẵn). Phần khó là giữ cache đúng khi dữ liệu thay đổi và xử lý hot key: Grokking mô tả vấn đề hotkey trong cache phân tán và gợi ý chia nhỏ tiếp các key nóng.1 Cache có các chính sách ghi (write-through, write-back, write-around),2 và replica giúp tăng khả năng sẵn sàng và chia tải đọc.3 Thứ tự các bước giải trên là cách sắp xếp của khoá học. Chi tiết ở Scale đọc.
Scale ghi
Khi một primary không chịu nổi lượng ghi, bạn cần gom ghi theo lô, đưa qua queue để hấp thụ đỉnh, chia shard theo khoá, hoặc chuyển sang kho ghi tốt như Cassandra. Với dữ liệu đếm, có thể cộng dồn trước rồi mới ghi. Queue tách bên gửi và bên nhận để hấp thụ đỉnh tải,4 còn sharding chia dữ liệu theo khoá trên nhiều node.5 Chi tiết ở Scale ghi.
Tranh chấp tài nguyên
Hai người cùng bấm mua chiếc vé cuối cùng. Lời giải gồm khoá dòng trong database, optimistic locking bằng version, giữ chỗ có thời hạn trong Redis, và hàng đợi hoặc phòng chờ ảo khi lượng người tranh quá lớn. Chọn cách nào phụ thuộc mức độ tranh chấp và thời gian giữ. Optimistic locking bằng version được Microservices Patterns nhắc khi xử lý cập nhật đồng thời.6 Khoá dòng, giữ chỗ bằng Redis TTL và phòng chờ ảo là cách giải của khoá học, các bài chi tiết ghi nguồn cụ thể.7 Chi tiết ở Tranh chấp tài nguyên.
Cập nhật realtime
Client cần thấy thay đổi gần như ngay. Lựa chọn đi từ polling, long polling, Server-Sent Events tới WebSocket. Phía server cần pub/sub để chuyển tin giữa các gateway,8 và phải tính số kết nối mỗi máy. Grokking dùng WebSocket giữa client và server chat trong bài WhatsApp.9 Một gateway 2 vCPU · 4 GB giữ khoảng 20.000–50.000 kết nối ít hoạt động (ước lượng của khoá học, cần load test).7 Chi tiết ở Cập nhật realtime.
Tác vụ dài
Không bắt người dùng chờ request HTTP trong lúc encode video. Trả về ngay một job id, đưa việc vào queue, worker xử lý, client theo dõi trạng thái qua polling hoặc thông báo. Phần đáng nói: retry, idempotency, dead letter queue và scale worker theo độ dài hàng đợi. Grokking nêu task scheduler thử lại số lần cho phép khi task lỗi và yêu cầu task idempotent;10 hàng đợi cần xử lý tin trùng.11 Chi tiết ở Tác vụ dài.
File lớn
File không đi qua API server. Client xin presigned URL rồi upload thẳng lên object storage, file lớn chia thành nhiều phần để upload lại từng phần khi lỗi. Phát lại qua CDN. Database chỉ lưu metadata. Blob store lưu file dạng đối tượng và chia thành các chunk phân bổ trên nhiều data node;12 CDN đưa nội dung tới gần người dùng.13 Presigned URL là kỹ thuật của khoá học, chưa có sách trong thư viện mô tả.14 Chi tiết ở File lớn.
Quy trình nhiều bước
Khi một nghiệp vụ chạm nhiều service hoặc đối tác bên ngoài, không có transaction chung. Lời giải gồm outbox pattern, saga với bước bù trừ, và workflow engine như Temporal để giữ trạng thái và retry.15 Transactional outbox và saga đều có trong Microservices Patterns; riêng Temporal chưa có sách trong thư viện.16 Chi tiết ở Quy trình nhiều bước.
Trong phỏng vấn: gọi tên pattern giúp người nghe theo kịp. Ví dụ: "Đây là bài toán tranh chấp tài nguyên, em sẽ đi từ khoá dòng trong Postgres, chỉ ra điểm yếu khi đông người, rồi chuyển sang giữ chỗ bằng Redis".
Nguồn trích dẫn
-
Grokking Modern System Design · ch.16 Distributed Cache · phần bàn về hotkey (cache client và sharding thêm cho các key nóng). ↩
-
Grokking Modern System Design · ch.16 Distributed Cache · mục "Writing policies". ↩
-
Grokking Modern System Design · ch.9 Databases · bài về replication, mục "Replication" (Availability: databases can be replicated). ↩
-
Grokking Modern System Design · ch.17 Distributed Messaging Queue · phần mở đầu về lợi ích của message queue. ↩
-
Grokking Modern System Design · ch.9 Databases · bài về partitioning, mục "Sharding". ↩
-
Microservices Patterns (file .zip, tải về giải nén) · ch.6 Developing business logic with event sourcing · mục "Handling concurrent updates using optimistic locking". ↩
-
Cách giải của khoá học, xem các bài Tranh chấp tài nguyên và Cập nhật realtime; con số năng lực là ước lượng, không trích từ sách. ↩ ↩2
-
Grokking Modern System Design · ch.18 Pub-sub · phần mở đầu "System Design: The Pub-sub Abstraction". ↩
-
Grokking Modern System Design · ch.36 Design WhatsApp · phần thiết kế (kết nối WebSocket giữa client và chat server). ↩
-
Grokking Modern System Design · ch.23 Distributed Task Scheduler · mục "Task idempotency" và phần task bị lỗi được thử lại. ↩
-
Grokking Modern System Design · ch.17 Distributed Messaging Queue · phần bàn về tin nhắn trùng lặp (duplicates). ↩
-
Grokking Modern System Design · ch.20 Blob Store · phần thiết kế (file chia thành chunk lưu ở các data node). ↩
-
Grokking Modern System Design · ch.11 Content Delivery Network (CDN) · mục "Problem statement". ↩
-
Chưa có nguồn trong thư viện: thư viện không mô tả presigned URL hay multipart upload; giữ lại như kiến thức cơ bản. ↩
-
Microservices Patterns (file .zip, tải về giải nén) · ch.4 Managing transactions with sagas · mục "Pattern: Saga"; ch.3 · mục "Pattern: Transactional outbox". ↩
-
Chưa có nguồn trong thư viện: thư viện không có sách về Temporal; chỉ nêu vai trò cơ bản của workflow engine. ↩