Monolith System Design (2/10): Scale 1 user — kiến trúc MVP ShortLink
Thiết kế hệ thống giai đoạn MVP: monolith, Nginx, PostgreSQL một server — API URL shortener, schema SQL, sequence redirect, failure mode trước khi scale.
· 2 min read
Khóa học System Design cơ bản — thiết kế hệ thống scale 1 → 1 triệu user · Phần 2/10▼
Phần 2/10 · Trước: Phần 1 — Nền tảng · Sau: Phần 3 — ~100 user
Mục tiêu
Xây đúng hệ thống nhỏ nhất còn chạy được — không over-engineer.
Kiến trúc
User → Nginx (TLS) → Monolith App → PostgreSQL
↓
log file local
| Component | Vai trò |
|---|---|
| Nginx | HTTPS, reverse proxy, có thể serve static |
| Monolith | REST: POST /links, GET /:slug redirect |
| PostgreSQL | Source of truth |
| Log local | Debug; chưa centralized |
API v1
| Method | Path | Mô tả |
|---|---|---|
| POST | /api/links | Body: target_url → trả slug |
| GET | /:slug | 302 redirect + tăng counter (sync) |
| GET | /api/links | List link (auth sau) |
Schema
CREATE TABLE short_links (
id BIGSERIAL PRIMARY KEY,
slug VARCHAR(12) NOT NULL UNIQUE,
target_url TEXT NOT NULL,
click_count BIGINT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_short_links_slug ON short_links(slug);
Chọn slug: base62 random 8 ký tự — collision thấp; retry nếu trùng.
Sequence: redirect
Client GET /abc
→ App SELECT target_url FROM short_links WHERE slug='abc'
→ UPDATE click_count = click_count + 1
→ 302 Location: target_url
Với 1 user, 2 query/request là chấp nhận được.
Failure mode (chưa scale)
- SPOF — máy chết = hết service.
- Deploy — restart = downtime vài giây.
- Disk đầy — log + DB cùng disk.
- Không backup — mất data irrecoverable.
- Brute force slug — chưa rate limit.
Ghi lại list này — mỗi phần sau xóa một vài mục.
Bài tập
- Vẽ sequence
POST /api/links. - Ước lượng dung lượng DB nếu 1 user tạo 1000 link/năm, 5 năm.
- Liệt kê 3 lý do chưa tách microservice ở giai đoạn này.
Câu hỏi thường gặp
Monolith có nghĩa là không được dùng nhiều file code?
Monolith là một deployable unit — một process (hoặc một repo deploy chung), không phải ‘một file’. Bạn vẫn modular hóa trong codebase.
Bài đọc tiếp theo
Thiết kế hệ thống cơ bản (1/10): Học System Design — metric, QPS, CAP
System design là gì? Khóa miễn phí 10 phần: functional/non-functional, QPS, p99, availability, CAP — ước lượng traffic ShortLink scale 1→1M user. Bản đồ: /blog/hoc-system-design-co-ban-tu-dau
Đọc tiếp →Capstone URL shortener (10/10): System Design 1M MAU + rubric
Đề phỏng vấn URL shortener: 20k RPS redirect, 200 write/s, p99 & availability — rubric 100 điểm và đáp án tham khảo.
Đọc tiếp →Scale database (3/10): ~100 user — PostgreSQL managed & connection pool
Thiết kế hệ thống ~100 người dùng: tách PostgreSQL managed, connection pool, health check, backup — chuẩn bị scale app sau này.
Đọc tiếp →Startup của bạn cần tech partner?
Trao đổi miễn phí về MVP, timeline và mô hình chia lợi nhuận phù hợp.