System Design là một kỹ năng cần thiết đối với các kỹ sư phần mềm đang tham gia hay muốn xây dựng các ứng dụng phức tạp; nó đòi hỏi khả năng tư duy sáng tạo và có hệ thống về cách giải quyết vấn đề cũng như việc áp dụng kiến thức kỹ thuật để thực hiện các giải pháp một cách hiệu quả. Bài viết hôm nay chúng ta cùng nhau điểm qua top 10 khái niệm System Design mà mọi lập trình viên nên biết để có thể tự tin hơn khi tham gia vào các dự án lớn trong tương lai nhé.
System Design là gì?
System Design (thiết kế hệ thống) là quá trình xác định kiến trúc (architecture), thành phần (component), module và giao diện (interfaces) của một hệ thống để đáp ứng các yêu cầu cụ thể, cũng như xác định các công nghệ và công cụ sẽ được sử dụng để triển khai hệ thống.
Các bước trong quá trình System Design
Xác định yêu cầu
- Thu thập yêu cầu: Liên hệ với khách hàng, người dùng, và các bên liên quan để hiểu rõ mong muốn và nhu cầu cụ thể của họ.
- Phân tích yêu cầu: Xem xét và phân loại các yêu cầu thành yêu cầu chức năng (những gì hệ thống phải làm) và phi chức năng (hiệu suất, bảo mật, tính khả dụng).
Thiết kế cấp cao (High-Level Design)
High-Level Design (HLD) là bước quan trọng trong quá trình thiết kế hệ thống, nơi chúng ta xác định kiến trúc tổng thể và cấu trúc chính của hệ thống. Các bước chi tiết bao gồm:
- Xác định kiến trúc hệ thống: Trong bước này, kiến trúc tổng thể của hệ thống được xác định. Hệ thống được chia thành các thành phần lớn, mỗi thành phần có chức năng riêng. Sử dụng các sơ đồ như sơ đồ kiến trúc, sơ đồ luồng dữ liệu (DFD), và sơ đồ quan hệ thực thể (ERD) để biểu diễn cấu trúc và mối quan hệ giữa các thành phần.
- Xác định thành phần chính: Sau khi xác định kiến trúc, các thành phần chính của hệ thống được liệt kê và mô tả. Mỗi thành phần chính được xác định với vai trò và chức năng cụ thể trong hệ thống. Các mối quan hệ và cách tương tác giữa các thành phần này cũng được làm rõ.
- Phân tích và mô hình hóa yêu cầu: Yêu cầu chức năng và phi chức năng của hệ thống được phân tích chi tiết. Các yêu cầu này được mô hình hóa bằng cách sử dụng các mô hình biểu diễn như Use Case để mô tả tương tác giữa người dùng và hệ thống.
Thiết kế cấp thấp (Low-Level Design)
Low-Level Design là bước tiếp theo sau HLD, nơi các thành phần và mô-đun của hệ thống được chi tiết hóa. Các bước chi tiết bao gồm:
- Xác định chi tiết các thành phần: Các thành phần lớn từ HLD được chia nhỏ thành các mô-đun nhỏ hơn. Mỗi mô-đun được mô tả chi tiết về cách hoạt động và tương tác với nhau. Điều này đảm bảo rằng tất cả các phần của hệ thống đều được định rõ và có thể phát triển một cách độc lập.
- Tạo biểu đồ lớp và biểu đồ tuần tự: Biểu đồ lớp được sử dụng để mô tả cấu trúc nội bộ của từng mô-đun. Biểu đồ tuần tự mô tả cách các đối tượng trong hệ thống tương tác qua từng bước. Những biểu đồ này giúp đảm bảo rằng tất cả các tương tác trong hệ thống đều được xác định rõ ràng và có thể thực hiện được.
- Xác định giao diện và phương thức: Các giao diện giữa các mô-đun và các phương thức được sử dụng trong hệ thống được xác định rõ ràng. Điều này giúp đảm bảo rằng tất cả các mô-đun có thể tương tác với nhau một cách hiệu quả và không có sự xung đột.
- Kiểm tra và xem xét thiết kế chi tiết: Thực hiện các bài kiểm tra mô phỏng để đảm bảo thiết kế hoạt động đúng như mong đợi. Đánh giá lại thiết kế để tìm và khắc phục bất kỳ lỗi hoặc điểm yếu nào. Điều này đảm bảo rằng thiết kế cuối cùng là chính xác và hiệu quả.
Kiểm tra và xác thực thiết kế
Thực hiện các bài kiểm tra mô phỏng để đảm bảo thiết kế hoạt động đúng như mong đợi. Đánh giá lại toàn bộ thiết kế để tìm ra và khắc phục các lỗi hoặc điểm yếu.
Triển khai và bảo trì
Đưa hệ thống vào sử dụng thực tế. Quá trình này có thể bao gồm việc cài đặt phần mềm, cấu hình hệ thống, và đào tạo người dùng. Liên tục giám sát, khắc phục lỗi, và cập nhật hệ thống để đảm bảo nó hoạt động ổn định và đáp ứng các yêu cầu mới.
10 khái niệm liên quan đến System Design
Scalability – Khả năng mở rộng
Khả năng mở rộng là khả năng của một hệ thống có thể xử lý tải tăng lên mà không làm giảm hiệu suất. Để làm được điều này thì khi thiết kế, các kỹ sư cần xem xét đến yếu tố liên quan đến việc phân chia dữ liệu, cân bằng tải và bộ nhớ đệm.
Availability – Tính khả dụng
Tính khả dụng hay tính sẵn sàng là khả năng mà một hệ thống có thể duy trì hoạt động ngay cả khi một số thành phần bị lỗi. Để thiết kế được một hệ thống đảm bảo tính khả dụng thì bạn cần đến các yếu tố dự phòng, chuyển đổi dự phòng, kết hợp với việc hệ thống có khả năng chịu lỗi.
Consistency – Tính nhất quán
Tính nhất quán là một thuộc tính của hệ thống trong đó tất cả các nodes đều nhìn thấy cùng một dữ liệu tại cùng một thời điểm. Để đảm bảo được thuộc tính này, bạn cần xem xét đến yếu tố như sao chép dữ liệu, giao dịch phân tán và giải quyết xung đột.
3 tính chất trên được xem là những yếu tố cơ bản cần có khi thiết kế một hệ thống. Nó cũng được thường xuyên đề cập đến trong các định lý, lý thuyết khi xây dựng một hệ thống tiêu chuẩn. Chẳng hạn như định lý CAP; trong đó Partition Tolerance là khả năng chịu lỗi của hệ thống đề cập đến việc hệ thống đảm bảo phải hoạt động bình thường dù các kết nối của các node trong hệ thống bị đứt gãy.
Partition – Phân vùng
Phân vùng là quá trình chia dữ liệu thành các phần nhỏ hơn và giúp dễ quản lý hơn. Các yếu tố như kiểu truy cập dữ liệu, phân phối dữ liệu và sao chép dữ liệu sẽ được xem xét đến khi bạn muốn thực hiện phân vùng dữ liệu trên hệ thống một cách hiệu quả.
Trong hệ thống cơ sở dữ liệu, Data Partitioning hay phân vùng dữ liệu thông thường được chia thành 2 loại:
- Theo chiều ngang – còn được gọi là sharding là cách chia các hàng của bảng thành các bảng nhỏ hơn và lưu trữ trên các server
- Theo chiều dọc – thực hiện chia các cột của bảng thành các bảng riêng biệt giúp giảm số lượng cột để nhằm cải thiện hiệu suất truy vấn
Load Balancing – Cân bằng tải
Cân bằng tải là quá trình phân phối lưu lượng mạng trên nhiều server để tránh tình trạng quá tải. Cân bằng tải đóng vai trò quan trọng đặc biệt trong các tình huống mà lưu lượng truy cập tăng đột biến hoặc khi lượng request đến các server không đồng đều.
Để thực hiện cân bằng tải thì kỹ sư hệ thống thường áp dụng một số thuật toán để xác định phân phối lưu lượng truy cập đến như:
- Round Robin: phân phối tuần tự, đồng đều các request
- Least Connections: chỉ định request đến server có ít hoạt động nhất
- IP Hash: Sử dụng hash-function để xác định máy chủ cho request dựa trên IP của khách
Caching – Bộ nhớ đệm
Caching là một quá trình lưu trữ dữ liệu thường xuyên truy cập vào bộ nhớ để giúp truy cập nhanh hơn trong những lần sau. Bộ nhớ đệm là một lớp lưu trữ tốc độ cao, thông thường nằm giữa ứng dụng và nguồn dữ liệu. Khi dữ liệu được ứng dụng yêu cầu, hệ thống sẽ thực hiện tìm kiếm trong bộ đệm trước; nhờ có tốc độ truy xuất cao sẽ giúp tiết kiệm thời gian, tăng hiệu suất của xử lý. Nếu dữ liệu yêu cầu không được tìm thấy thì hệ thống mới xử lý đến bước tìm kiếm trong nguồn dữ liệu.
Nhắc đến System Design thì không thể không nhắc đến các thiết kế kiến trúc phổ biến hiện nay bao gồm Monolith, SOA và Microservices. Trong đó Monolith là một mô hình truyền thống phù hợp với các dự án quy mô nhỏ. Các hệ thống hiện nay để đáp ứng được với nhu cầu tăng cao và sự tích hợp của nhiều dịch vụ khác nhau thì SOA và Microservices được ưu tiên lựa chọn.
Tham khảo việc làm Database hấp dẫn tại TopDev!
Microservices
Microservices là một cách tổ chức các ứng dụng như một tập hợp các dịch vụ được liên kết một cách lỏng lẻo và có thể triển khai một cách độc lập. Mỗi service trong hệ thống sẽ đảm nhận một phần chức năng hoặc domain cụ thể trong ứng dụng và có thể giao tiếp với các service khác thông qua các APIs được quy định trước. Để xây dựng được kiến trúc Microservices, chúng ta cần quan tâm xem xét đến các yếu tố như ranh giới giữa các dịch vụ con cùng khả năng giao tiếp giữa chúng.
SOA – Service-Oriented Architecture
Kiến trúc hướng dịch vụ là một cách tiếp cận thiết kế phần mềm mà trong đó các ứng dụng được xây dựng như một tập hợp các dịch vụ. Khác biệt chính giữa SOA và Microservices là phạm vi áp dụng: trong khi SOA thường được áp dụng đối với phạm vi các doanh nghiệp nơi các ứng dụng giao tiếp với nhau thì Microservices hướng đến việc phát triển các ứng dụng nơi mà giao tiếp giữa các thành phần trong một ứng dụng.
DNS – Domain Name System
Hệ thống phân giải tên miền DNS là thành phần cơ bản của cơ sở hạ tầng Internet giúp dịch các tên miền thành địa chỉ IP tương ứng. Mỗi doanh nghiệp, tổ chức có thể có những địa chỉ tên miền nội bộ mà chỉ được sử dụng trong phạm vi doanh nghiệp, vì vậy khi thiết kế hệ thống, chúng ta cùng cần xây dựng DNS riêng cho doanh nghiệp đó tương ứng.
CDN – Content Delivery Network
Mạng phân phối nội dung CDN là một mạng lưới gồm các máy chủ được kết nối với nhau giúp tăng tốc độ tải trang Web cho các ứng dụng tiêu tốn nhiều dữ liệu. Khi người dùng truy cập vào một trang Web, dữ liệu từ máy chủ của trang Web đó phải di chuyển trên mạng Internet để đến được máy tính của người dùng; nếu như người dùng ở xa so với máy chủ đó thì sẽ mất nhiều thời gian tải những nội dung lớn như tệp, hình ảnh, văn bản, … Để giải quyết vấn đề này, các nội dung trên sẽ được lưu trữ trên các máy chủ CDN gần hơn với người dùng theo địa lý để giảm thời gian tải và tăng tốc độ truy cập trang Web.
Trên đây là khái niệm thiết kế hệ thống – Design System là gì, các bước cơ bản để xây dựng một hệ thống và top 10 khái niệm về System Design cơ bản nhất mà mọi kỹ sư hệ thống đều phải nắm được. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.
Tác giả: Phạm Minh Khoa
Xem thêm Việc làm IT hấp dẫn trên TopDev