Thiết kế hệ thống cơ bản cho junior: ví dụ rút gọn URL từng bước

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Nhiều bạn nghĩ thiết kế hệ thống chỉ dành cho vị trí senior. Thực tế, các công ty cũng thường hỏi những bài thiết kế quy mô nhỏ với junior để xem cách bạn suy nghĩ về bức tranh tổng thể. Bạn không cần biết mọi công nghệ, chỉ cần một quy trình rõ ràng và hiểu vài khối xây dựng cơ bản.

Quy trình bốn bước cho mọi bài thiết kế

  1. Làm rõ yêu cầu: chức năng chính, quy mô dự kiến, yêu cầu về độ trễ và độ sẵn sàng.
  2. Ước lượng sơ bộ: số người dùng, số yêu cầu mỗi giây, dung lượng dữ liệu.
  3. Thiết kế mức cao: các thành phần chính và luồng dữ liệu.
  4. Đào sâu và đánh đổi: chọn cơ sở dữ liệu, cache, điểm nghẽn, cách mở rộng.

Bài ví dụ: dịch vụ rút gọn URL

Yêu cầu: người dùng nhập một đường dẫn dài, hệ thống trả về đường dẫn ngắn; khi ai đó truy cập đường dẫn ngắn, hệ thống chuyển hướng đến đường dẫn gốc.

Bước 1: Làm rõ yêu cầu

  • Có cần tùy chỉnh đường dẫn ngắn không? Có thời hạn hết hạn không?
  • Có cần thống kê lượt nhấn không?
  • Số lượng đọc nhiều hơn số lượng ghi (tỉ lệ đọc/ghi cao)? Với dịch vụ này, thường đúng như vậy.

Bước 2: Giao diện API

POST /api/links       { "url": "https://example.com/rat-dai" }-> 201 { "short": "https://sho.rt/aB3dE9" }GET  /aB3dE9-> 302 Location: https://example.com/rat-dai

Bước 3: Mô hình dữ liệu

Một bảng đơn giản là đủ: mã ngắn (khóa chính), URL gốc, thời điểm tạo, thời điểm hết hạn (tùy chọn), người tạo (tùy chọn). Truy vấn chính là tìm theo mã ngắn nên cần chỉ mục hoặc khóa chính trên cột này.

Bước 4: Sinh mã ngắn

Có ba hướng thường gặp:

  • Mã ngẫu nhiên: sinh chuỗi 6 đến 8 ký tự từ bảng chữ cái và chữ số, kiểm tra trùng trước khi lưu. Đơn giản nhưng cần xử lý va chạm.
  • Mã hóa số tăng dần: dùng bộ đếm tăng dần rồi đổi sang hệ cơ số 62. Không trùng, nhưng mã đoán được; có thể xáo trộn để khó đoán hơn.
  • Băm URL rồi cắt: cùng URL ra cùng mã, nhưng vẫn phải xử lý đụng độ.
const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';function toBase62(n) {  if (n === 0) return '0';  let s = '';  while (n > 0) {    s = ALPHABET[n % 62] + s;    n = Math.floor(n / 62);  }  return s;}console.log(toBase62(125)); // 21

Với 6 ký tự trong bảng 62 ký tự, ta có khoảng 56 tỉ tổ hợp, thừa sức cho nhiều ứng dụng nhỏ và vừa.

Bước 5: Đọc nhanh bằng cache

Vì lượt đọc rất nhiều, việc dùng bộ nhớ đệm như Redis để lưu ánh xạ mã ngắn sang URL gốc giúp giảm tải cơ sở dữ liệu đáng kể. Cách làm: khi nhận yêu cầu, kiểm tra cache trước; nếu không có, truy vấn cơ sở dữ liệu rồi ghi vào cache với thời gian sống hợp lý. Một số đường dẫn rất phổ biến sẽ luôn nằm trong cache.

Bước 6: Chuyển hướng 301 hay 302?

301 là chuyển hướng vĩnh viễn, trình duyệt có thể nhớ nên giảm tải cho hệ thống nhưng bạn khó thống kê lượt nhấn. 302 là tạm thời, mỗi lần nhấn đều đi qua máy chủ nên thống kê chính xác hơn. Đây là một đánh đổi điển hình để nêu ra.

Các khối xây dựng thường dùng

  • Load balancer: chia tải giữa nhiều máy chủ ứng dụng.
  • Cache: giảm thời gian đọc và tải cho cơ sở dữ liệu.
  • Cơ sở dữ liệu: quan hệ cho dữ liệu có cấu trúc, NoSQL khi cần mở rộng ngang hoặc mô hình linh hoạt.
  • Hàng đợi tin nhắn: tách các tác vụ chậm (gửi email, xử lý thống kê) khỏi luồng chính.
  • CDN: phân phối nội dung tĩnh gần người dùng.

Nói về mở rộng và điểm nghẽn

Bắt đầu bằng thiết kế đơn giản chạy được, sau đó hỏi: điều gì hỏng đầu tiên khi lượng người dùng tăng gấp mười? Có thể là cơ sở dữ liệu (thêm bản sao đọc, phân mảnh dữ liệu), máy chủ ứng dụng (thêm máy phía sau load balancer) hoặc bộ đếm sinh mã (cần phân phối khoảng giá trị cho từng máy chủ). Hãy trình bày các đánh đổi thay vì khẳng định một đáp án duy nhất.

Lỗi thường gặp

  • Lao vào chọn công nghệ trước khi hiểu yêu cầu.
  • Thiết kế quá phức tạp cho bài toán nhỏ, thêm microservice và hàng đợi khi chưa cần.
  • Không đề cập tới lỗi, bảo mật và theo dõi hệ thống.
  • Không nói thành tiếng suy nghĩ để người phỏng vấn hướng dẫn.

Kết luận

Với junior, người phỏng vấn đánh giá tư duy hệ thống hơn là kiến thức quy mô lớn. Hãy luyện vài bài như rút gọn URL, hệ thống ghi chú, tin nhắn đơn giản, và ghi lại quy trình bốn bước để áp dụng mỗi lần.

Để nắm vững nền tảng backend, cơ sở dữ liệu và triển khai ứng dụng, bạn có thể xem các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment