Trong bài này, chúng ta sẽ cùng tìm hiểu cách các kiến trúc mềm được phân loại như nào cùng ưu và nhược của từng loại.
1. Cách phân loại phổ biến
Các mẫu kiến trúc phần mềm thường được chia thành hai loại chính:
- Kiến trúc nguyên khối (Monolithic architecture)
- Kiến trúc phân tán (Distributed architecture)
1.1. Kiến trúc nguyên khối (Monolithic architecture)
Kiến trúc nguyên khối (Monolithic architecture) được triển khai trên một đơn vị duy nhất (single deployment unit).
Đơn vị triển khai (Deployment unit) đề cập đến một đơn vị phần mềm độc lập và riêng biệt về mặt logic, có thể được triển khai, lập phiên bản và quản lý độc lập trong một ứng dụng. Ví dụ, trên một server, bạn có thể cài một database và một service. Ở đây, chúng ta có hai đơn vị triển khai.
Ưu điểm:
- Thiết kế đơn giản và triển khai, vận hành dễ dàng: Do tất cả các thành phần được tích hợp trong một mã nguồn duy nhất, việc phát triển, xây dựng, và triển khai ứng dụng trở nên đơn giản hơn.
- Dễ dàng test và debug: Có thể test toàn bộ ứng dụng một cách dễ dàng và tìm kiếm lỗi trong môi trường đồng nhất.
- Hiệu suất cao trong các ứng dụng ít phức tạp: Các ứng dụng ít phức tạp có thể chạy hiệu quả với kiến trúc monolithic do giảm thiểu giao tiếp mạng và độ trễ.
Nhược điểm:
- Khó khăn khi scale ứng dụng: Khi ứng dụng phát triển quy mô, việc quản lý trở nên phức tạp.
- Độ tin cậy thấp: Khi một component trong hệ thống bị lỗi có thể ảnh hưởng tới toàn bộ ứng dụng, làm giảm độ tin cậy của hệ thống.
- Thiếu linh hoạt với thay đổi: Các thành phần chức năng thường được gắn kết chặt chẽ, làm cho việc tái cấu trúc hay thay đổi một phần nhỏ trở nên khó khăn.
Các mẫu kiến trúc phầm mềm nằm trong nhóm kiến trúc nguyên khối:
- Kiến trúc phân lớp (Layered architecture)
- Kiến trúc client-server
- Kiến trúc đường ống (Pipeline architecture)
- Kiến trúc vi nhân (Microkernel architecture)
1.2. Kiến trúc phân tán (Distributed architecture)
Kiến trúc phân tán (Distributed architecture) được triển khai trên nhiều đơn vị (multiple deployment units) làm việc cùng nhau để thực hiện một số loại chức năng business gắn kết.
Ưu điểm:
- Khả năng chịu lỗi: Nếu một dịch vụ bị lỗi, các dịch vụ khác có thể tiếp tục thực hiện các yêu cầu dịch vụ như thể không có lỗi nào xảy ra. Các dịch vụ bị lỗi có thể phục hồi rất nhanh - nhanh đến mức đôi khi người dùng cuối thậm chí còn không biết rằng dịch vụ đã gặp phải lỗi nghiêm trọng.
- Khả năng thích ứng: Chức năng của ứng dụng được chia thành các đơn vị phần mềm được triển khai riêng biệt, dễ dàng xác định vị trí và áp dụng thay đổi hơn, phạm vi thử nghiệm được giảm xuống chỉ còn dịch vụ bị ảnh hưởng và rủi ro triển khai giảm đáng kể vì thường chỉ triển khai dịch vụ bị ảnh hưởng.
Nhược điểm:
- Chịu ảnh hưởng lớn bởi 8 sai lầm trong tính toán phân tán.
- Quản lý các giao dịch phân tán, tính nhất quán cuối cùng, quản lý quy trình làm việc, xử lý lỗi, đồng bộ hóa dữ liệu.
Các mẫu kiến trúc phầm mềm nằm trong nhóm kiến trúc phân tán:
- Kiến trúc hướng sự kiện (Event-driven architecture)
- Kiến trúc microservice (Microservices architecture)
- Kiến trúc hướng không gian (Space-based architecture)
- Kiến trúc hướng dịch vụ (Service-oriented architecture)
2. Cách phân loại khác
Ngoài cách phân loại trên, các mẫu kiến trúc phần mềm cũng có thể được phân loại theo cách chia cấu trúc tổng thể của hệ thống. Theo cách chia này, chúng ta có hai loại chính là:
- Phân vùng kỹ thuật (Technically partitioned)
- Phân vùng theo domain (Domain partitioned)
2.1. Phân vùng kỹ thuật (Technically partitioned)
Trong phân vùng kỹ thuật, các component của hệ thống được tổ chức theo cách sử dụng kỹ thuật (technical usage). Ở ví dụ dưới sử dụng kiến trúc phân tầng, tầng Persistence chứa logic tương tác với database, tầng database chứa model của hệ thống, ...
Ưu điểm:
- Phù hợp với các team được tổ chức phân nhóm theo vai trò. Ví dụ: nhóm BE, nhóm FE, nhóm designer, ...
- Khi mã nguồn của bạn được tổ chức độc lập với nhau. Sự thay đổi của một layer sẽ không ảnh hưởng tới layer khác.
- Testing dễ dàng khi chỉ cần viết test cho từng layer và tạo mock test cho các layer còn lại.
Nhược điểm:
- Nếu chúng ta sửa business thì khả năng cao sẽ phải sửa lại tất cả các tầng do không có sự phân tách business giữa các tầng.
2.2. Phân vùng theo domain (Domain partitioned)
Trong phân vùng theo domain (Domain partitioned), các component của hệ thống được tổ chức theo domain.
Ưu điểm:
- Nếu business có thay đổi thì chỉ ảnh hưởng tới những service chứa domain đó.
- Phù hợp với các nhóm đa chức năng có chuyên môn (cross-functional team). Mỗi nhóm sẽ phụ trách một domain riêng biệt.
Nhược điểm:
- Viết unit test không dễ dàng do logic của các tầng phục vụ cho cùng một domain nên viết end-to-end test sẽ phù hợp hơn và dễ dàng hơn là unit test.
3. Tổng kết
- Hiện nay, có 2 cách phân loại kiến trúc phần mềm: cách phân loại phổ biến và cách phân loại dựa trên cách chia cấu trúc hệ thống.
- Các phân loại phổ biến chia kiến trúc phần mềm ra làm hai loại chính là kiến trúc monolithic và kiến trúc phân tán.
- Ngoài ra, có cách phân loại khác dựa trên cách chia cấu trúc của hệ thống bao gồm phân vùng kỹ thuật và phân vùng theo domain.
- Mỗi loại kiến trúc phần mềm đều có ưu điểm và nhược điểm riêng, do vậy, tuỳ yêu cầu của bài toán, chúng ta cần cân nhắc lựa chọn cho phù hợp.
Nếu bạn quan tâm và muốn tìm hiểu thêm về kiến trúc phần mềm, mời bạn tham khảo khoá học System Design tại 200Lab nhé!
4. Tài liệu tham khảo
- Fundamentals of Software Architecture - Mark Richards
- Software Architecture Patterns - Mark Richards
- Software Architecture Monday - Mark Richards
Bài viết liên quan
Architecture Pattern - Phần 6: Kiến trúc hướng không gian (Space-based architecture)
Mar 05, 2024 • 11 min read
Architecture Pattern - Phần 5: Giới thiệu kiến trúc Microservice
Mar 01, 2024 • 7 min read
Architecture Pattern - Phần 4: Kiến trúc vi nhân (Microkernel architecture)
Jan 24, 2024 • 7 min read
Architecture Pattern - Phần 3: Kiến trúc hướng sự kiện (Event-driven architecture)
Jan 24, 2024 • 11 min read
Architecture Pattern - Phần 2: Kiến trúc phân lớp (Layered architecture)
Jan 24, 2024 • 7 min read
Software Architecture là gì? Sự quan trọng của kiến trúc phần mềm
Jan 08, 2024 • 10 min read