Top 10 khái niệm System Design mà mọi lập trình viên nên biết

2353

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

1. 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. 

2. 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.

3. 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.

Consistency

4. 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

  Avalability vs Consistency

  Kỹ thuật tăng Database Performance, Availability và Scalability

5. 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

Load Balancing

6. 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.

Caching

Tham khảo việc làm Database hấp dẫn tại TopDev!

7. 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.

8. 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.

9. DNS – Domain Name System

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.

10. 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à 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; vì vậy nếu là một lập trình viên đang xây dựng các hệ thống phức tạp, quy mô lớn thì việc bạn hiểu rõ để thiết kế ra những ứng dụng phù hợp, đáp ứng được yêu cầu là điều vô cùng quan trọng. 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