Back to blog

Xây Dựng URL Shortener: Tổng Quan Series & Kiến Trúc

typescriptnodejspostgresqlredisfullstack
Xây Dựng URL Shortener: Tổng Quan Series & Kiến Trúc

Developer nào cũng từng dùng URL shortener — Bit.ly, TinyURL, short.io. Paste một link dài, nhận lại một link ngắn, share đi, và nó hoạt động ngon lành. Đơn giản phải không?

Nhưng đằng sau sự đơn giản đó là một bài toán engineering khá phong phú. Short code generation, collision handling, redirect performance, click analytics, caching layers, rate limiting, user authentication — một URL shortener chạm vào hầu hết mọi concept backend mà bạn sẽ gặp trong ứng dụng thực tế.

Đó là lý do nó là project hoàn hảo để build từ đầu. Trong series 15 bài này, chúng ta sẽ đi từ một thư mục trống đến một full-stack URL shortener với admin panel và SEO optimization, được deploy production, sử dụng Express + TypeScript, PostgreSQL + Prisma, Redis, và React.

Tại Sao Nên Build URL Shortener?

URL shortener nhìn bề ngoài đơn giản nhưng cover một loạt challenge backend thực tế:

✅ API design — RESTful endpoints với validation và error handling chuẩn chỉ
✅ Database modeling — schema design, indexes, migrations với Prisma ORM
✅ Algorithm design — Base62 encoding, collision detection, custom alias handling
✅ Performance optimization — Redis caching cho redirect dưới millisecond
✅ Analytics — tracking clicks, geolocation, referrers, device info
✅ Authentication — JWT-based auth với user-scoped URL management
✅ Full-stack development — React frontend với charts, QR codes và dashboards
✅ Testing — unit, integration và load testing strategies
✅ DevOps — Docker, CI/CD pipelines, monitoring và production deployment

Khác với các toy project, URL shortener có những vấn đề production thực sự: Chuyện gì xảy ra khi hai user generate cùng một short code? Làm sao handle hàng triệu redirect mỗi ngày mà không làm sập database? Làm sao ngăn chặn abuse?


Chúng Ta Sẽ Build Gì?

Đến cuối series này, bạn sẽ có một URL shortener hoạt động đầy đủ với các feature sau:

Core Features

  • Shorten URLs — paste một URL dài, nhận lại short link
  • Custom aliases — chọn short code riêng (ví dụ short.ly/my-resume)
  • Redirect engine — 301/302 redirect nhanh với caching
  • Click analytics — track tổng clicks, unique visitors, referrers, devices và dữ liệu địa lý
  • Expiration — đặt TTL cho short links (tự expire sau N ngày)

Advanced Features

  • User accounts — register, login, quản lý URLs trong dashboard
  • Rate limiting — ngăn abuse với Redis-based rate limiting
  • QR code generation — tạo QR codes cho bất kỳ shortened URL nào
  • Bulk shortening — shorten nhiều URLs trong một API call
  • API keys — programmatic access cho integrations

Admin & SEO Features

  • Admin panel — role-based access control, user management, URL moderation
  • Abuse detection — domain blocklists, automated flagging, community reporting
  • System analytics — dashboard metrics, click trends, top URLs, user growth
  • Audit logs — track mọi admin action với detailed change history
  • Link previews — OG meta tag scraping, social share images, bot-aware redirects

Tech Stack

Đây là toàn bộ technology chúng ta sẽ dùng và lý do:

LayerTechnologyLý Do
RuntimeNode.js 20+Non-blocking I/O, perfect cho high-throughput redirect handling
FrameworkExpress.jsMinimal, flexible, battle-tested HTTP framework
LanguageTypeScript 5Type safety, DX tốt hơn, bắt bugs lúc compile time
DatabasePostgreSQL 16ACID compliance, powerful indexing, JSON support cho analytics
ORMPrismaType-safe queries, auto-generated client, migrations dễ dàng
CacheRedis 7Sub-millisecond lookups cho hot URLs, rate limiting, session store
AuthJWT + bcryptStateless authentication, secure password hashing
FrontendReact 19 + ViteDev experience nhanh, component-based UI, chart libraries
TestingVitest + Supertest + k6Unit, integration và load testing
DevOpsDocker + GitHub ActionsContainerization, CI/CD, reproducible deployments
MonitoringPrometheus + GrafanaMetrics collection và visualization

Kiến Trúc Hệ Thống

Đây là cái nhìn tổng quan về hệ thống chúng ta sẽ build:

Request Flow: Shorten URL

Request Flow: Redirect


Database Schema Preview

Đây là phiên bản đơn giản của schema mà chúng ta sẽ design và cải tiến xuyên suốt series:

Các design decision quan trọng mà chúng ta sẽ explore:

  • Tại sao UUID thay vì auto-increment? — ngăn enumeration attacks trên short codes
  • Tại sao có click_count trên bảng URLs? — denormalized counter tránh expensive COUNT queries
  • Tại sao tách riêng bảng clicks? — granular analytics mà không làm phình bảng URLs
  • Indexes — chúng ta sẽ thêm composite indexes trên (short_code, is_active) để lookup nhanh

Roadmap Toàn Bộ Series

Bài #1: Tổng Quan Series & Kiến Trúc ✅ Bạn đang ở đây

  • Tại sao build URL shortener
  • Các quyết định tech stack và trade-offs
  • Kiến trúc hệ thống và data flow
  • Database schema preview

Phase 1: Setup Project & URL Shortening API

Bài #2: Phase 1 — Setup Project & URL Shortening API (Express + TypeScript)

Chủ đề:

  • Project scaffolding với Express + TypeScript
  • Folder structure cho scalable APIs
  • Endpoint đầu tiên: POST /api/shorten
  • URL validation và sanitization
  • In-memory storage (trước khi thêm database)
  • Error handling middleware
  • Environment configuration với dotenv

Kết Quả Học Tập:
✅ Setup project TypeScript + Express từ đầu
✅ Build API endpoint shortening URL hoạt động được
✅ Implement request validation và error handling chuẩn
✅ Cấu trúc Express project cho scale


Phase 2: Database Design & URL Storage

Bài #3: Phase 2 — Database Design & URL Storage (PostgreSQL + Prisma)

Chủ đề:

  • Setup PostgreSQL với Docker
  • Prisma schema design và migrations
  • CRUD operations cho URLs
  • Database indexing strategy
  • Thay thế in-memory storage bằng PostgreSQL
  • Connection pooling configuration

Kết Quả Học Tập:
✅ Design normalized database schema cho URL shortening
✅ Dùng Prisma ORM cho type-safe database operations
✅ Viết migrations hiệu quả và quản lý schema changes
✅ Optimize queries với proper indexing


Phase 3: Short Code Generation

Bài #4: Phase 3 — Short Code Generation (Base62, Collision Handling, Custom Aliases)

Chủ đề:

  • Thuật toán Base62 encoding
  • Short code length vs collision probability
  • Collision detection và retry strategies
  • Counter-based vs random generation trade-offs
  • Custom alias validation và reservation
  • URL deduplication (cùng URL → cùng short code?)

Kết Quả Học Tập:
✅ Implement Base62 encoding cho compact short codes
✅ Handle collisions gracefully ở scale lớn
✅ Support custom aliases với proper validation
✅ Hiểu toán học đằng sau short code uniqueness


Phase 4: Redirect Engine & Click Analytics

Bài #5: Phase 4 — Redirect Engine & Click Analytics

Chủ đề:

  • 301 vs 302 redirects (SEO implications)
  • Efficient redirect lookup pipeline
  • Click event recording (non-blocking)
  • Parse user-agent, referrer và IP geolocation
  • Analytics aggregation queries
  • Handle expired và deactivated URLs

Kết Quả Học Tập:
✅ Build redirect engine hiệu suất cao
✅ Ghi click analytics mà không block redirects
✅ Parse và lưu device, referrer và geo data
✅ Viết aggregation queries cho analytics dashboards


Phase 5: Caching với Redis

Bài #6: Phase 5 — Caching với Redis (URL Lookups & Rate Limiting)

Chủ đề:

  • Setup Redis và connection management
  • Cache-aside pattern cho URL lookups
  • Cache invalidation strategies
  • TTL-based expiration cho short URLs
  • Rate limiting với sliding window algorithm
  • Redis như session store

Kết Quả Học Tập:
✅ Implement cache-aside pattern cho redirect dưới millisecond
✅ Handle cache invalidation đúng cách
✅ Build rate limiting để ngăn API abuse
✅ Hiểu Redis data structures cho use cases thực tế


Phase 6: User Authentication & URL Management

Bài #7: Phase 6 — User Authentication & URL Management Dashboard

Chủ đề:

  • JWT authentication (access + refresh tokens)
  • User registration và login endpoints
  • Password hashing với bcrypt
  • Middleware-based route protection
  • User-scoped URL management (CRUD)
  • API key generation cho programmatic access

Kết Quả Học Tập:
✅ Implement JWT-based authentication từ đầu
✅ Bảo vệ API routes với authentication middleware
✅ Build user-scoped resource management
✅ Generate và validate API keys


Phase 7: Frontend với React

Bài #8: Phase 7 — Frontend với React (URL Creation, Analytics Charts, QR Codes)

Chủ đề:

  • Setup project React + Vite
  • Form shorten URL với validation
  • Dashboard quản lý URLs (list, edit, delete)
  • Analytics charts với Recharts (clicks theo thời gian, top referrers, device breakdown)
  • QR code generation với qrcode.react
  • Responsive design với Tailwind CSS

Kết Quả Học Tập:
✅ Build frontend đầy đủ feature cho URL shortener
✅ Hiển thị analytics data với interactive charts
✅ Generate QR codes cho shortened URLs
✅ Kết nối React frontend với Express API


Phase 8: Testing Strategy

Bài #9: Phase 8 — Testing Strategy (Unit, Integration, Load Testing)

Chủ đề:

  • Unit testing với Vitest (services, utilities)
  • Integration testing với Supertest (API endpoints)
  • Database testing với test containers
  • Mocking Redis và external services
  • Load testing với k6 (redirect throughput, concurrent shortening)
  • Test coverage và CI integration

Kết Quả Học Tập:
✅ Viết unit tests cho business logic và utilities
✅ Build integration tests cho API endpoints
✅ Load test redirect engine dưới high concurrency
✅ Setup test automation trong CI/CD


Phase 9: Deployment & Production

Bài #10: Phase 9 — Deployment & Production (Docker, CI/CD, Monitoring)

Chủ đề:

  • Multi-stage Docker builds cho API và frontend
  • Docker Compose cho full stack (API + PostgreSQL + Redis)
  • GitHub Actions CI/CD pipeline
  • Health check endpoints
  • Prometheus metrics và Grafana dashboards
  • Logging với structured JSON logs
  • Production hardening (CORS, Helmet, compression)

Kết Quả Học Tập:
✅ Containerize toàn bộ application với Docker
✅ Setup CI/CD với GitHub Actions
✅ Monitor application health với Prometheus và Grafana
✅ Deploy production-ready application với confidence


Phase 10: Admin Panel — RBAC & User Management

Bài #11: Phase 10 — Admin Panel — RBAC & User Management

Chủ đề:

  • Role-based access control (USER, ADMIN, SUPER_ADMIN)
  • Admin middleware để protect admin-only routes
  • User management API (list, search, view details)
  • Account suspension và reactivation
  • Admin promotion và demotion
  • Seeding admin user đầu tiên

Kết Quả Học Tập:
✅ Implement role-based access control với Prisma enums
✅ Build composable middleware cho role checking
✅ Tạo admin user management endpoints
✅ Handle account suspension xuyên suốt auth flow


Phase 11: URL Moderation & Abuse Detection

Bài #12: Phase 11 — URL Moderation, Bulk Operations & Abuse Detection

Chủ đề:

  • URL moderation workflow (active → flagged → disabled)
  • Admin URL listing với filters và search
  • Bulk operations (disable, delete, flag nhiều URLs)
  • Domain blocklist management
  • Automated abuse detection (rate-based, pattern matching)
  • Community URL reporting system

Kết Quả Học Tập:
✅ Build URL moderation system với status workflows
✅ Implement bulk operations với transaction safety
✅ Tạo domain blocklist để ngăn malicious URLs
✅ Thêm automated abuse detection và community reporting


Phase 12: System Analytics & Audit Logs

Bài #13: Phase 12 — System Analytics Dashboard & Audit Logs

Chủ đề:

  • System dashboard API với key metrics
  • Time-series analytics (clicks, URL creation, user growth)
  • Top performers (most clicked URLs, most active users)
  • Geographic và device analytics
  • Admin audit log system
  • Audit log querying và filtering

Kết Quả Học Tập:
✅ Build system-wide analytics với efficient aggregation queries
✅ Tạo time-series data endpoints cho dashboard charts
✅ Implement comprehensive audit log system
✅ Cache expensive analytics queries với Redis


Phase 13: React Admin Dashboard UI

Bài #14: Phase 13 — React Admin Dashboard UI

Chủ đề:

  • Admin layout với sidebar navigation
  • Dashboard overview với metric cards và trend indicators
  • Analytics page với Recharts charts
  • User management table với search và actions
  • URL moderation queue với bulk selection
  • Audit log viewer với expandable details

Kết Quả Học Tập:
✅ Build admin dashboard hoàn chỉnh với React và Tailwind CSS
✅ Hiển thị analytics với interactive Recharts visualizations
✅ Tạo data tables với search, filters và pagination
✅ Implement role-based route protection trong React


Chủ đề:

  • OG meta tag scraping từ destination URLs
  • Link preview metadata storage và caching
  • Bot-aware redirect handling (crawlers vs humans)
  • Dynamic OG image generation với Satori
  • Preview page cho short URLs
  • Social platform compatibility (Facebook, Twitter, Slack, LinkedIn, Discord)

Kết Quả Học Tập:
✅ Scrape và cache OG metadata từ destination URLs
✅ Serve rich link previews cho social media bots
✅ Generate dynamic OG images cho short links
✅ Handle bot detection và SSRF prevention


Giải Thích Các Architecture Decisions

Trước khi bắt đầu code, hãy hiểu một vài quyết định quan trọng:

Tại Sao Express Thay Vì Fastify Hay Hono?

Express là framework Node.js được dùng rộng rãi nhất. Nó có ecosystem lớn nhất, nhiều tutorial nhất, và vẫn là lựa chọn mặc định của đa số teams. Dù Fastify nhanh hơn và Hono nhẹ hơn, middleware ecosystem và community support của Express khiến nó là lựa chọn tốt nhất để học. Mọi thứ bạn học với Express đều transfer trực tiếp sang các framework khác.

Tại Sao PostgreSQL Thay Vì MongoDB?

URL shortening bản chất là relational — URLs thuộc về users, clicks thuộc về URLs. PostgreSQL cho chúng ta:

  • ACID transactions cho reliable short code generation
  • Unique constraints để ngăn collisions
  • Powerful indexing cho fast lookups
  • JSON columns cho flexible metadata storage
  • Window functions cho analytics aggregation

Tại Sao Redis Cho Caching?

Redirect path là đường dẫn nóng nhất trong URL shortener. Một short link phổ biến có thể nhận hàng triệu hits. Redis cho chúng ta:

  • Sub-millisecond reads — nhanh gấp 100 lần so với database query
  • Built-in TTL — automatic cache expiration
  • Atomic operations — perfect cho rate limiting counters
  • Pub/Sub — cache invalidation across multiple instances

Tại Sao Prisma Thay Vì Raw SQL Hay Knex?

Prisma cung cấp:

  • Type-safe queries — TypeScript types auto-generated từ schema
  • Declarative migrations — schema changes tracked trong version control
  • Query engine — handle connection pooling và query optimization
  • Studio — visual database browser cho development

Learning Paths

Chọn path phù hợp với mục tiêu của bạn:

Path 1: Backend Developer (Bài 1–6)

Thời gian: 2–3 tuần, 1–2 giờ mỗi ngày
Focus: API design, database modeling, caching, performance

Bỏ qua frontend (Bài 8) và dùng curl hoặc Postman để test API. Path này cover các concept backend engineering cốt lõi.

Path 2: Full-Stack Developer (Toàn bộ 15 bài)

Thời gian: 6–7 tuần, 1–2 giờ mỗi ngày
Focus: End-to-end application development

Theo thứ tự từng bài. Bạn sẽ build toàn bộ application từ API đến frontend đến deployment, rồi thêm admin features và SEO.

Path 3: DevOps Focus (Bài 1–2, 6, 9–10)

Thời gian: 1–2 tuần, 1–2 giờ mỗi ngày
Focus: Containerization, testing, CI/CD, monitoring

Chạy API cơ bản, rồi nhảy sang Redis, testing và deployment. Path này focus vào infrastructure và operations.

Path 4: Admin & Security Focus (Bài 1–7, 11–13)

Thời gian: 3–4 tuần, 1–2 giờ mỗi ngày
Focus: RBAC, moderation, abuse prevention, audit logging

Build core API với auth, rồi đi sâu vào admin panel features. Path này cover enterprise-grade access control và content moderation.


Prerequisites

Trước khi bắt đầu series này, bạn nên thoải mái với:

  • JavaScript/TypeScript — variables, functions, async/await, Promises
  • Node.js basics — npm, modules, HTTP concepts cơ bản
  • SQL fundamentals — SELECT, INSERT, JOIN, indexes
  • Command line — navigating directories, running scripts
  • Git — commits, branches, workflow cơ bản
  • Docker basics — running containers (chúng ta sẽ cover Docker Compose chi tiết)

Mới với TypeScript? Xem TypeScript Full-Stack Roadmap trước.

Mới với React? Bài frontend (Bài 8) yêu cầu kiến thức React. Xem bài React Fundamentals.


URL Shortener vs Các Project Khác

Tại sao URL shortener tốt hơn todo app hay blog cho việc học?

Khía CạnhTodo AppBlogURL Shortener
CRUD complexityCơ bảnTrung bìnhCao (URLs + Users + Clicks)
Performance needsThấpThấpCao (redirect latency quan trọng)
CachingKhông cầnOptionalThiết yếu
AnalyticsKhông cóPage viewsRich click analytics
Auth complexityĐơn giảnTrung bìnhAPI keys + JWT + rate limiting
System designTrivialĐơn giảnLevel phỏng vấn thực tế
DevOpsCơ bảnCơ bảnFull stack (Redis, Postgres, Docker)

URL shortener đủ phức tạp để dạy engineering skills thực tế nhưng đủ tập trung để hoàn thành trong vài tuần. Nó cũng là câu hỏi system design interview kinh điển — build một cái cho bạn hiểu sâu về các trade-offs.


Tiếp Theo Là Gì?

Trong Bài #2, chúng ta sẽ setup project Express + TypeScript từ đầu, build endpoint POST /api/shorten đầu tiên, và khiến URL shortener trả về short codes thật. Chưa có database — chúng ta sẽ dùng in-memory storage để focus thuần vào API design và validation.

Bắt tay vào build thôi.

Series: Build a URL Shortener
Next: Phase 1: Setup Project & URL Shortening API

📬 Đăng ký nhận bản tin

Nhận những bài viết mới nhất qua email mỗi tuần. Không spam, hủy đăng ký bất cứ lúc nào.

Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất cứ lúc nào.

💬 Comments

Đăng nhập để bình luận

Chúng tôi sẽ không đăng bất cứ điều gì mà không có sự cho phép của bạn.