Xuất bản khoảng 22 giờ trước 6 1 0 31
  • 6 1

System Design Là Thứ Giúp Hệ Thống “Sống Sót”, Không Chỉ Giúp Bạn “Thiết Kế Cho Đẹp”

Một trong những điều rất dễ gây ảo giác khi làm backend là cảm giác mọi thứ vẫn đang ổn.

API vẫn chạy.

Database vẫn trả dữ liệu.

Server vẫn còn sống.

Request vẫn trả về 200 OK.

Mọi thứ trông có vẻ ổn đến mức nhiều người nghĩ rằng hệ thống của mình đã “được thiết kế tốt”.

Nhưng rồi một ngày, traffic tăng lên.

Một dependency bắt đầu chậm.

Một retry vô tình tạo ra dữ liệu trùng.

Một service nhỏ gặp sự cố nhưng kéo theo cả chuỗi request phía sau cùng ngã xuống.

User vừa bấm thanh toán xong, nhưng kết quả giữa các service lại không còn đồng nhất.

Lúc đó chúng ta mới nhận ra một điều:

Biết viết backend không đồng nghĩa với việc biết thiết kế hệ thống.

Và đó cũng chính là lý do System Design Series ra đời.

System Design không chỉ là vẽ box và arrow

Khi mới tiếp cận system design, rất nhiều người hình dung nó như một bài tập kiến trúc.

Vẽ vài service.

Thêm database.

Gắn cache.

Đặt load balancer ở phía trước.

Nếu “xịn” hơn thì thêm queue, gateway, search, CDN, autoscaling.

Cách nhìn này không sai.

Nhưng nó mới chỉ là bề mặt.

Trong production, system design không phải là trò ghép component.

Nó là cách chúng ta trả lời những câu hỏi rất thật:

  • Request đi qua hệ thống như thế nào?
  • Dữ liệu được đọc và ghi ra sao?
  • Hệ thống chịu tải tăng bằng cách nào?
  • Khi một phần gặp lỗi, phần còn lại sống sót ra sao?
  • Và khi sản phẩm tiếp tục phát triển, kiến trúc có tiến hóa nổi hay không?

Nói cách khác.

System design không chỉ là sơ đồ kỹ thuật.

Nó là cách hệ thống giữ lời hứa với người dùng khi quy mô, độ phức tạp và rủi ro cùng tăng lên.

Phần lớn developer học System Design theo kiểu “rời từng mảnh”

Nếu nhìn lại cách nhiều backend developer học system design, hành trình đó thường rất quen thuộc.

Đầu tiên là học cache.

Sau đó học queue.

Tiếp theo là load balancer.

Rồi đến sharding, replication, microservices, event-driven, CQRS.

Từng chủ đề đều quan trọng.

Nhưng chúng thường được học như những mảnh kiến thức tách rời.

Điều đó khiến nhiều người có thể biết rất nhiều khái niệm, nhưng lại không thật sự hiểu:

  • Vì sao kỹ thuật đó xuất hiện?
  • Nó giải quyết vấn đề gì trong production?
  • Nó làm hệ thống tốt hơn ở đâu?
  • Và nó làm hệ thống đắt hơn, khó hơn, hoặc rủi ro hơn ở đâu?

Ví dụ.

Bạn có thể biết cache giúp tăng tốc độ đọc.

Nhưng chưa chắc đã hiểu invalidation mới là phần đau nhất của cache.

Bạn có thể biết microservices giúp tách hệ thống.

Nhưng chưa chắc đã hiểu coordination cost và operability pain tăng lên như thế nào.

Bạn có thể biết replication giúp scale read.

Nhưng chưa chắc đã thấy stale read sẽ tác động ra sao tới trải nghiệm người dùng.

Bạn có thể biết retry làm tăng độ bền.

Nhưng chưa chắc đã thấy retry sai chỗ có thể tạo ra duplicate processing hoặc làm sập downstream nhanh hơn.

Những vấn đề đó không còn là câu chuyện của từng component riêng lẻ.

Chúng là câu chuyện của tư duy hệ thống.

Đây không phải là một series học mẹo interview

Series này không được viết để giúp bạn thuộc vài “template” rồi lặp lại trong phỏng vấn.

Cũng không phải một bộ checklist kiểu:

  • Bài nào cũng thêm cache.
  • Scale thì thêm queue.
  • Muốn hiện đại thì tách microservices.
  • Muốn hệ thống lớn thì thêm event-driven.

Những cách học như vậy rất dễ tạo ra ảo giác hiểu biết.

Điều TechCraft muốn làm khác đi là giúp bạn hiểu vì sao hệ thống phải được thiết kế như vậy.

Thay vì chỉ học:

Dùng load balancer như thế nào?

Chúng ta sẽ cùng nhìn vào:

Vì sao một server không thể mãi đứng một mình ở cửa vào?

Thay vì chỉ học:

Cache là gì?

Chúng ta sẽ cùng nhìn vào:

Vì sao có những request không đáng để trả giá bằng một lần đọc đắt đỏ từ nguồn gốc?

Thay vì chỉ học:

Queue giúp xử lý bất đồng bộ.

Chúng ta sẽ cùng nhìn vào:

Khi nào async flow thực sự cần thiết, và cái giá phải trả là retry, ordering, duplicate processing cùng độ khó vận hành tăng lên như thế nào?

Đó là góc nhìn mà một system-minded engineer cần có.

Từ component thinking đến system thinking

Điều thú vị là càng làm backend lâu, bạn sẽ càng nhận ra rằng phần lớn vấn đề của production không đến từ việc “không biết công nghệ”.

Chúng đến từ việc không nhìn thấy mối liên hệ giữa các quyết định thiết kế.

Ví dụ:

  • Khi chọn microservices, bạn không chỉ tách codebase. Bạn đang thay đổi cách team deploy, debug, observe và phối hợp giữa nhiều boundary khác nhau.
  • Khi chọn replication, bạn không chỉ tăng khả năng đọc. Bạn đang chấp nhận khả năng dữ liệu trả về không còn mới nhất ở mọi thời điểm.
  • Khi chọn queue, bạn không chỉ tối ưu throughput. Bạn đang bước vào thế giới của retry, at-least-once delivery, duplicate processing và eventual consistency.
  • Khi chọn API versioning, bạn không chỉ đổi endpoint. Bạn đang quyết định xem sản phẩm có thể tiến hóa mà không làm client cũ gãy hay không.

Đó là lý do system design không phải là chuyện của từng box riêng lẻ.

Nó là chuyện của cả dòng chảy hệ thống.

Chúng ta sẽ đi qua những gì?

Để giúp người học có một hành trình rõ ràng và tăng dần độ khó, toàn bộ series được chia thành 6 giai đoạn.

Phần 1 — Foundations & Design Thinking

Chúng ta bắt đầu từ câu hỏi nền tảng nhất.

System Design thực chất là gì?

Tư duy bài toán như thế nào?

Requirement và estimation quan trọng ra sao?

Vì sao một thiết kế tốt luôn bắt đầu từ việc hiểu đúng bài toán trước khi chọn giải pháp?

Phần 2 — Core Building Blocks & Architectural Trade-offs

Sau khi có nền tư duy, chúng ta đi vào các thành phần cốt lõi của một hệ thống.

  • Microservices vs Monolith
  • API Design
  • Load Balancer
  • Cache
  • SQL vs NoSQL

Nhưng không học chúng như những món đồ chơi kỹ thuật.

Mà học chúng như những quyết định mang theo trade-off thật sự.

Phần 3 — Reliability, Throughput & Traffic Management

Khi hệ thống bắt đầu lớn lên, câu hỏi không còn là “build được hay không”.

Mà là:

  • Hệ thống chịu tải thế nào?
  • Xử lý tác vụ nền ra sao?
  • Tối ưu phân phối nội dung như thế nào?
  • Tìm kiếm ở quy mô lớn làm sao?
  • Quan sát production bằng logs, metrics, tracing thế nào?
  • Và khi dependency bắt đầu chậm hoặc lỗi, hệ thống chống đỡ ra sao?

Phần 4 — Coordination, Consistency & Distributed Workflows

Đây là đoạn mà độ khó tăng mạnh.

Chúng ta sẽ bước vào những bài toán rất thật của distributed systems:

  • Distributed Lock
  • Leader Election
  • Replication
  • Sharding
  • Consistency Models
  • CAP Theorem
  • Idempotency
  • Saga Pattern

Đây là nơi người học bắt đầu thấy vì sao correctness trong hệ thống phân tán chưa bao giờ là chuyện đơn giản.

Phần 5 — Evolution, Data Flow & Advanced Architecture

Sau khi hiểu cách hệ thống hoạt động và chịu lỗi, chúng ta chuyển sang một câu hỏi trưởng thành hơn:

Làm sao để hệ thống tiến hóa mà không tự phá chính nó?

Đó là lúc chúng ta bàn về:

  • API Versioning
  • Feature Flag
  • Blue-Green và Canary Deployment
  • Event-Driven Architecture
  • CQRS
  • Read/Write Splitting
  • Serverless

Đây là phần nói nhiều về evolvability, compatibility và tốc độ phát triển sản phẩm.

Phần 6 — Operations, Platform & Resilience

Ở chặng cuối, góc nhìn tiếp tục mở rộng từ service-level sang platform-level.

Chúng ta sẽ đi qua:

  • Infrastructure as Code
  • Autoscaling
  • Rate Limiting for Fairness
  • Failure Isolation

Lúc này câu hỏi không còn là:

“Hệ thống chạy được không?”

Mà là:

  • Hệ thống có tự bảo vệ mình được không?
  • Hệ thống có công bằng với các tenant và nhóm người dùng khác nhau không?
  • Hệ thống có cô lập được lỗi trước khi nó lan rộng không?

Series này dành cho ai?

Nếu bạn mới bắt đầu học lập trình và chưa có nhiều va chạm với backend, có lẽ đây chưa phải điểm khởi đầu dễ nhất.

Nhưng nếu bạn đã:

  • Làm backend một thời gian
  • Từng build API, dùng database, cache, queue hoặc vài service phụ trợ
  • Từng gặp những vấn đề production khó giải thích
  • Muốn hiểu sâu hơn vì sao hệ thống lớn lại được thiết kế theo những cách rất khác với tutorial cơ bản

Thì mình tin đây sẽ là một series rất đáng để theo dõi.

Mục tiêu của TechCraft không phải là dạy bạn “vẽ kiến trúc cho ngầu”.

Mục tiêu là giúp bạn thay đổi cách nhìn về hệ thống.

Kết

Sau nhiều năm làm backend, mình nhận ra một điều.

Rất ít hệ thống gặp vấn đề vì team không biết thêm component.

Phần lớn vấn đề xuất hiện vì team chưa hiểu rõ trade-off, boundary, failure mode và áp lực tiến hóa của hệ thống khi sản phẩm bắt đầu lớn lên.

Hy vọng System Design Series sẽ giúp bạn nhìn system design không chỉ như một chủ đề để phỏng vấn, mà như một năng lực cốt lõi để xây dựng những sản phẩm thực sự sống khỏe trong production.

Trong bài viết đầu tiên, chúng ta sẽ bắt đầu từ câu hỏi nền tảng nhất:

System Design thực sự là gì, và vì sao một backend engineer giỏi code vẫn có thể gặp rất nhiều giới hạn nếu chưa có tư duy thiết kế hệ thống?

Chia sẻ

NỘI DUNG


Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí