Playground: học bằng cách ra quyết định Cơ bản
Đọc về race condition khác hẳn việc tự tay chọn sai rồi thấy 40 đơn bán vượt kho. Mỗi bài ở đây là một tình huống nhỏ: bạn ra quyết định, hệ thống phản ứng ngay.
Đang tải diagram…
Mới: Scale Lab
Phần tiêu đề “Mới: Scale Lab”Scale Lab là game system design trên canvas: kéo server, load balancer, cache, CDN, queue lên bảng, nối dây, bấm Chạy và xem traffic chảy qua thiết kế. Mỗi vòng tải tăng, có vòng có biến cố (server chết…). Sập thì box hỏng bị khoanh đỏ và có giải thích. Có 8 vòng Learn, 4 đề phỏng vấn nhiều vòng (URL shortener, Notifications, Bán vé concert, Chat realtime), và Sandbox để tự đặt traffic, bot và biến cố.
Các bài
Phần tiêu đề “Các bài”Bốn kiểu chơi: Tình huống (chọn cách xử lý qua nhiều bước), Thiết kế (kéo thả kiến trúc), Sắp xếp (đúng thứ tự) và Ghép cặp (giải pháp ↔ vấn đề).
Database
Phần tiêu đề “Database”| Bài | Kiểu | Bạn luyện | Thời gian |
|---|---|---|---|
| Flash sale bán vượt kho | Tình huống | Lost update, giữ lock khi gọi payment, retry tạo đơn trùng | ~5 phút |
| Query chậm dần | Tình huống | pg_stat_statements, đọc EXPLAIN, composite index, keyset pagination | ~6 phút |
| Migration khoá cả bảng | Tình huống | Lock queue, lock_timeout, DDL nào rewrite bảng, NOT VALID |
~6 phút |
| Lộ dữ liệu giữa tenant | Tình huống | Quên lọc tenant_id, RLS bị owner / BYPASSRLS bỏ qua, SET theo session rò qua connection pool |
~7 phút |
| Chọn lock/isolation | Ghép cặp | Atomic UPDATE, FOR UPDATE, SKIP LOCKED, SERIALIZABLE, advisory lock… | ~6 phút |
| Chọn loại index | Ghép cặp | B-tree, composite, partial, expression, covering, GIN, BRIN | ~6 phút |
| Tạo index online | Sắp xếp | CREATE INDEX CONCURRENTLY, index INVALID, xác nhận plan |
~3 phút |
| Đổi tên cột không downtime | Sắp xếp | Expand–contract khi rolling deploy | ~3 phút |
System design
Phần tiêu đề “System design”| Bài | Kiểu | Bạn luyện | Thời gian |
|---|---|---|---|
| Dựng URL shortener | Thiết kế | CDN, cache, replica, capacity trong ngân sách | ~5–10 phút |
| Checkout bất đồng bộ | Thiết kế | Outbox, broker, idempotency, retry/DLQ, bẫy dual write và 2PC | ~10 phút |
| Upload ảnh & video | Thiết kế | Presigned URL, multipart, object storage, transcode worker, CDN signed cookie | ~10 phút |
| Sao đăng bài | Tình huống | Fan-out khi ghi hay khi đọc, write amplification, ngưỡng hybrid cho tài khoản lớn | ~6 phút |
| Bù trừ saga | Sắp xếp | Thanh toán lỗi giữa saga: lưu trạng thái, dừng bước tiếp, bù trừ theo thứ tự ngược, báo khách | ~3 phút |
| Thanh toán timeout | Tình huống | Kết quả không rõ sau timeout, giữ nguyên idempotency key, webhook đến muộn, đối soát và bút toán điều chỉnh | ~7 phút |
| Chọn HTTP status code | Ghép cặp | 400 hay 422, 401/403/404, 409, 412, 429, 503, 202 theo RFC 9110 | ~5 phút |
| Chọn Cache-Control | Ghép cặp | no-store hay no-cache, private, s-maxage, immutable, stale-while-revalidate theo RFC 9111 |
~5 phút |
| Chọn design pattern | Ghép cặp | Strategy, Adapter, Decorator, Observer, Factory, Facade | ~5 phút |
Messaging & cache
Phần tiêu đề “Messaging & cache”| Bài | Kiểu | Bạn luyện | Thời gian |
|---|---|---|---|
| Kafka consumer lag tăng mãi | Tình huống | Hot partition, rebalance storm, poison message, scale partition | ~6 phút |
| Tương thích schema | Ghép cặp | Thay đổi Avro/Protobuf: backward, forward, full hay phá vỡ, và bên nào deploy trước | ~5 phút |
| Cache stampede | Tình huống | Hot key hết hạn, singleflight, invalidation race, negative cache | ~6 phút |
Vận hành & sự cố
Phần tiêu đề “Vận hành & sự cố”| Bài | Kiểu | Bạn luyện | Thời gian |
|---|---|---|---|
| Sự cố 3 giờ sáng | Tình huống | Mitigate trước, giao tiếp, root cause có bằng chứng, postmortem | ~6 phút |
| Retry storm | Tình huống | Retry nhân tải qua từng tầng, backoff + jitter, retry budget, deadline | ~6 phút |
| Rò rỉ bộ nhớ Node.js | Tình huống | OOMKilled, heap snapshot an toàn, Map không giới hạn, --max-old-space-size |
~6 phút |
| CPU throttling | Tình huống | p99 tăng vọt khi CPU mới 40%: CFS quota, throttled period, threadpool burst, limit và request | ~6 phút |
| Probe restart dây chuyền | Tình huống | Liveness gọi database, CrashLoopBackOff, thiết kế probe đúng | ~5 phút |
| Thứ tự ứng cứu sự cố | Sắp xếp | Các bước từ lúc nhận page tới postmortem | ~3 phút |
| Graceful shutdown | Sắp xếp | Pod bị terminate: preStop, SIGTERM, drain, SIGKILL | ~3 phút |
| Canary & feature flag | Sắp xếp | Ship tắt sẵn, tiêu chí dừng theo SLO, ramp theo cohort, gỡ flag | ~3 phút |
Bảo mật & quan sát
Phần tiêu đề “Bảo mật & quan sát”| Bài | Kiểu | Bạn luyện | Thời gian |
|---|---|---|---|
| JWT bị lộ | Tình huống | Thu hồi token, blast radius, secret yếu, thiết kế lại | ~6 phút |
| Luồng OAuth PKCE | Sắp xếp | Authorization Code + PKCE, state/nonce, đổi token, kiểm tra phía API |
~4 phút |
| API lộ dữ liệu | Tình huống | BOLA/IDOR, mass assignment, blast radius từ access log, authz ở tầng dữ liệu | ~6 phút |
| Log, metric hay trace? | Ghép cặp | Chọn đúng tín hiệu, SLO burn-rate alert, bẫy cardinality | ~5 phút |
Cách chơi
Phần tiêu đề “Cách chơi”- Kéo thả bằng chuột hoặc ngón tay. Không tiện kéo thì chạm để chọn, rồi chạm vào chỗ muốn đặt. Bàn phím: Enter để chọn và đặt.
- Màu chỉ số: xanh là đạt, cam là sát ngưỡng, đỏ là hỏng. Vạch đậm trên thanh là mục tiêu.
- Tiến độ được nhớ ngay trên trình duyệt của bạn. Không cần tài khoản, không gửi đi đâu.
Con số trong game là mô hình đơn giản hoá để thấy xu hướng, không phải benchmark. Mỗi bài đều dẫn tới bài viết có số đo thật và nguồn chính thức.