Monolithic Architecture – Kiến trúc một khối truyền thống

Monolithic Architecture – Kiến trúc một khối truyền thống

October 26, 2020 2 By Nam Vu

Monolith là một từ cổ để chỉ một khối đá khổng lồ. Trong công nghệ phần mềm, một mẫu nguyên khối đề cập đến một đơn vị phần mềm không thể chia tách. Khái niệm phần mềm nguyên khối nằm trong các thành phần khác nhau của ứng dụng được kết hợp thành một chương trình duy nhất trên một nền tảng duy nhất. Thông thường, ứng dụng nguyên khối bao gồm cơ sở dữ liệu, giao diện người dùng phía client và ứng dụng phía máy chủ. Tất cả các bộ phận của phần mềm được hợp nhất và tất cả các chức năng của phần mềm được quản lý ở một nơi.

Thử tưởng tượng bạn đang phải xây dựng một dịch vụ gọi taxi qua di động nhằm cạnh tranh với Uber và Grab. Sau một số buổi họp thu thập yêu cầu và phân tích thiết kế, bạn sẽ chọn công nghệ (technology stack) rồi tạo dự án bằng các framework đại loại như Rails, Spring Boot, Play. Dự án này sẽ có kiến trúc chia khối lục giác (hexagol architecture) hay tổng quát hơn là khối đa diện. Kiến trúc đa diện giúp ứng dụng chuyên biệt mô hình dữ liệu.

Nhìn vào lõi của ứng dụng, ta thấy business logic được thể hiện bởi các khối dịch vụ (services), đối tượng cho từng vùng nghiệp vụ (domain objects) và các sự kiện (events). Xung quanh lõi là các adapter để kết nối vào cơ sở dữ liệu, gửi nhận message, web service hoặc front-end web application.

Một kiến trúc nguyên khối sẽ dễ thực hiện cho các công ty nhỏ, đó là lý do tại sao nhiều công ty khởi nghiệp chọn phương pháp này khi xây dựng ứng dụng. Các thành phần của phần mềm nguyên khối được kết nối với nhau và phụ thuộc lẫn nhau, giúp phần mềm được khép kín. Kiến trúc này là một giải pháp truyền thống để xây dựng các ứng dụng, nhưng một số lập trình viên thấy nó đã lỗi thời. Tuy nhiên, trong nhiều trường hợp, một kiến trúc nguyên khối là một giải pháp hoàn hảo cho một số loại phần mềm.

Ưu điểm:

Phát triển và triển khai đơn giản
Có rất nhiều công cụ có thể tích hợp vào kiến trúc này để phát triển. Ngoài ra, tất cả các đoạn code được để chung một thư mục, giúp cho việc triển khai dễ dàng hơn. Với bộ core nguyên khối, các lập trình viên không cần triển khai các thay đổi hoặc cập nhật riêng lẻ, vì họ có thể làm điều đó cùng một lúc và tiết kiệm rất nhiều thời gian.

Hiệu suất tốt hơn
Nếu được xây dựng đúng cách, các ứng dụng nguyên khối thường có hiệu suất cao hơn các ứng dụng dựa trên microservice. Ứng dụng có kiến trúc microservice có thể cần thực hiện 40 lệnh gọi API đến 40 dịch vụ microservice khác nhau để load từng màn hình, điều này rõ ràng dẫn đến hiệu suất chậm hơn. Đổi lại, các ứng dụng nguyên khối cho phép giao tiếp nhanh hơn giữa các thành phần phần mềm do code và bộ nhớ được chia sẻ.

Nhược điểm:

Codebase trở nên cồng kềnh theo thời gian
Theo thời gian, hầu hết các sản phẩm phát triển gia tăng, phạm vi và cấu trúc  trở nên rất khó kiểm soát. Các đoạn code bắt đầu trông thực sự đồ sộ và trở nên khó hiểu và khó sửa đổi, đặc biệt là đối với các lập trình viên mới. Chất lượng code ngày càng giảm và môi trường phát triển tích hợp (IDE) bị quá tải vì phải load quá nhiều file cùng 1 lúc.

Khó áp dụng công nghệ mới
Nếu có nhu cầu thêm một số công nghệ mới vào ứng dụng, các lập trình viên có thể gặp phải rào cản đối với việc áp dụng. Thêm công nghệ mới có nghĩa là viết lại toàn bộ ứng dụng, việc này rất tốn kém và mất thời gian.

Kém linh hoạt
Trong các ứng dụng nguyên khối, mỗi bản cập nhật nhỏ yêu cầu deploy lại đầy đủ. Vì vậy, tất cả các lập trình viên phải đợi cho đến khi deploy xong. Khi một vài nhóm cùng làm việc trong cùng một dự án, hiệu xuất phát triển chung có thể giảm đi rất nhiều.

Tóm lại

Ứng dụng viết kiểu này cực kì phổ biến. Chúng hoàn toàn dễ phát triển, đặc biệt cùng với sự phát triển của IDE và những tool khác tập trung vào xây dựng những ứng dụng đơn lẻ dựa trên template sẵn có. Tại sao lại vậy? Đơn giản thôi, do họ cần thuyết phục lập trình viên đi theo công nghệ/framework nên nhà sản xuất phải làm sao lập trình chỉ cần New Project, ấn nút Build & Run là ứng dụng chạy được ngay và luôn. Bạn có thể dễ dàng thực hiện testing bằng cách chạy ứng dụng và thực hiện test UI bằng Selenium. Ứng dụng một khối như thế này khá dễ triển khai. Đơn giản là chỉ cần copy gói được build ra lên server. Thêm nữa, những ứng dụng dạng này cũng có thể dễ dàng scale bằng cách chạy nhiều instance được phân tải bằng load balancer. Trong giai đoạn đầu sau khi triển khai, chúng hoạt động vô cùng tốt.

Mô hình nguyên khối chưa bị lỗi thời và nó vẫn hoạt động tốt trong một số trường hợp. Kiến trúc phần mềm nguyên khối có thể có lợi nếu công ty đang ở giai đoạn sáng lập, đang xây dựng một sản phẩm chưa được chứng minh và không có kinh nghiệm với microservice. Monolithic khá hoàn hảo cho các công ty mới khởi nghiệp cần có một sản phẩm và chạy càng sớm càng tốt. Tuy nhiên, một số vấn đề được đề cập ở trên cần được cân nhắc khi xây dụng phần mềm nguyên khối.