Kiến thức · 08/09/2023 0

Kiến trúc Monolith và Microservices trong xây dựng phần mềm

Ứng dụng Monolithic được xây dựng như một khối tổng thể, trong khi kiến trúc microservices là một tập hợp các thành phần nhỏ và có thể triển khai độc lập. Vậy, khi xây dựng ứng dụng, ta nên sử dụng kiến trúc nào, điều này phụ thuộc vào một số yếu tố.

Trong bài viết này, mình sẽ phân tích sự giống và khác nhau giữa kiến trúc Monolithic và Microservices và lựa chọn phương án phù hợp để xây dựng ứng dụng của bạn tùy vào nhiều yếu tố.

Bối cảnh

Năm 2009, Netflix đối mặt với nhiều vấn đề. Cơ sở hạ tầng của Netflix không thể chịu được nhu cầu tăng nhanh chóng từ các nền tảng dịch vụ streaming. Công ty đã quyết định chuyển đổi kiến trúc hạ tầng từ trung tâm dữ liệu riêng sang một dịch vụ Cloud và thay đổi kiến trúc Monolithic thành microservices. Vấn đề duy nhất là, thuật ngữ “microservices” lúc đó còn chưa ra đời và kiến trúc này cũng chưa được nhiều người biết tới.

Netflix đã trở thành công ty lớn đầu tiên dịch chuyển thành công từ monolith sang microservices trên cloud. Nhờ đó, Netflix cũng đã thắng giải JAX Special Jury Award 2015 cho việc đi đầu trong việc tạo ra kiến trúc hình thành nên “DevOps” hiện tại. Ngày nay, Netflix đã có hơn 1000 microservices khác nhau đóng vai trò quản lý và hỗ trợ các thành phần riêng biệt trên nền tảng, trong khi những kĩ sư vẫn sửa và thay đổi code thường xuyên, đôi khi nhiều lần một ngày.

Netflix chính là người đi tiên phong trong cái đã trở thành một xu hướng mới hiện tại: chuyển đổi từ kiến trúc monolith sang một kiến trúc microservices.

Kiến trúc monolithic là gì?

Kiến trúc monolithic là một mô hình truyền thống cho việc phát triển một phần mềm, trong đó, nó được xây dựng như một khối duy nhất và được vận hành độc lập với những ứng dụng khác. Từ “monolithic” thường để chỉ vật gì đó lớn và nguyên khối, tương tự như cách ta mô tả kiến trúc phần mềm bên trên. Một phần mềm với kiến trúc monolith là một mạng lưới tính toán lớn, với một mã nguồn duy nhất, xử lý tất cả các vấn đề trong 1 phần mềm. Để thay đổi một chức năng, ta buộc phải cập nhật cả hệ thống bằng cách sửa lại mã nguồn và triển khai một phiên bản cập nhật

Ưu/Nhược điểm của kiến trúc Monolithic

  • Dễ triển khai: Chỉ cần triển khai một file thực thi hoặc một folder
  • Dễ phát triển: Một ứng dụng chỉ được xây dựng từ một mã nguồn, nên dễ dàng phát triển hơn
  • Hiệu năng: Với kiến trúc tập trung, mô hình monolithic giảm thiểu tối đa độ trễ và số lượng API cần phải xây dựng
  • Dễ kiểm thử: bởi vì chỉ có một đơn vị duy nhất, monolithic dễ dàng test hơn
  • Dễ debug: với tất cả mã nguồn tập trung 1 chỗ, sẽ dễ hơn rất nhiều trong quá trình kiểm tra và phát hiện lỗi
  • Một thay đổi nhỏ có thể sẽ buộc bạn phải triển khai lại toàn bộ ứng dụng
  • Tốc độ phát triển chậm chạp: Việc phát triển một khối mã nguồn lớn sẽ phức tạp và chậm chạp hơn
  • Tính mở rộng
  • Tính phụ thuộc: Chỉ cần một module bị lỗi sẽ có thể ảnh hưởng tới toàn ứng dụng
  • Rào cản với các công nghệ mới
  • Thiếu tính linh hoạt

Microservices là gì?

Microservices là một kiến trúc bao gồm nhiều thành phần được triển khai độc lập. Những dịch vụ này xử lý những nhiệm vụ riêng và database riêng để thực hiện những mục tiêu nhất định. Cập nhật, kiểm thử, triển khai và mở rộng được thực hiện độc lập với mỗi thành phần. Microservices tách các thành phần, lĩnh vực khác nhau của ứng dụng thành các cơ sở độc lập, nó không làm giảm độ phức tạp nhưng nó sẽ làm chúng dễ thấy và dễ quản lý bởi các nhiệm vụ khác nhau hơn.

Thông thường, các thành phần trong hệ thống microservices sẽ giao tiếp với nhau thông qua một giao thức đồng bộ như HTTP/HTTPS với một dịch vụ API.

Áp dụng microservices thường đi kèm với devops, bởi vì devops là nền tảng cho việc cung cấp liên tục và cho phép ta thích nghi nhanh với những thay đổi từ yêu cầu.

Ưu/Nhược điểm của Microservices

  • Teamwork: Mô hình agile dễ dàng triển khai cho ứng dụng microservices, đồng thời những merge request cũng được xử lý nhanh hơn
  • Mở rộng linh hoạt: nếu một services bị quá tải, nó có thể dễ dàng được triển khai trên một server mới lớn hơn
  • Triển khai liên tục: ta có thể cập nhật từng thành phần nhanh chóng và nhiều lần trong ngày
  • Dễ dàng kiểm tra và bảo trì
  • Ngôn ngữ và công cụ linh hoạt cho từng microservice
  • Triển khai ngổn ngang: trái ngược với monolithic, microservices phải triển khai nhiều lần trên nhiều máy khác nhau, và nó tăng dần với mỗi microservices có trong hệ thống
  • Chi phí gia tăng: Mỗi microservices sẽ tốn một khoảng chi phí riêng để triển khai cũng như vận hành
  • Debugging khó khăn: mỗi microservice sẽ có một bộ log riêng, và có thể sẽ phải truy cập vào nhiều microservices khác nhau để có thể tìm ra chính xác lỗi xuất hiện ở đâu
  • Thiếu chuẩn và quyền sở hữu: việc có quá nhiều microservices trong hệ thống sẽ tạo ra sự khác nhau giữa các thành phần nhất là khi mỗi microservices được tạo ra bởi nhiều team khác nhau, ngôn ngữ khác nhau. Về lâu dài sẽ khó quản lý khi có sự thay đổi

Một vài Ví dụ

Kiến trúc Monolithic:

  1. WordPress: WordPress là một ví dụ điển hình của kiến trúc monolithic. Nó bao gồm một ứng dụng duy nhất chạy trên máy chủ web và xử lý mọi thứ từ quản lý nội dung, giao diện người dùng và cơ sở dữ liệu dựa trên ngôn ngữ PHP.
  2. Magento 1.x: Phiên bản ban đầu của Magento, một hệ thống thương mại điện tử phổ biến, sử dụng một kiến trúc monolithic. Tất cả các phần của trang web, bao gồm quản lý sản phẩm, giỏ hàng và thanh toán, đều được tích hợp trong một ứng dụng duy nhất.

Kiến trúc Microservices:

  1. Netflix: Netflix đã chuyển từ một kiến trúc monolithic sang microservices. Họ có các dịch vụ nhỏ độc lập cho việc xử lý video, quản lý người dùng, xử lý thanh toán và nhiều dịch vụ khác. Điều này cho phép họ linh hoạt mở rộng và cải thiện các phần cụ thể của ứng dụng mà không ảnh hưởng đến toàn bộ hệ thống.
  2. Uber: Uber sử dụng kiến trúc microservices cho các phần khác nhau của ứng dụng của họ. Họ có các dịch vụ riêng biệt cho việc đặt xe, xác định vị trí, thanh toán và quản lý tài khoản người dùng.
  3. Amazon: Amazon đã chuyển từ một kiến trúc monolithic đến một kiến trúc microservices. Họ có hàng trăm dịch vụ khác nhau cho các phần khác nhau của trang web, bao gồm lưu trữ, thanh toán, quản lý trình vận chuyển và nhiều dịch vụ khác.
  4. Airbnb: Airbnb đã chuyển sang một kiến trúc microservices để quản lý các tính năng khác nhau của nền tảng đặt phòng và thúc đẩy sự phát triển và cải thiện dễ dàng hơn.

Nhớ rằng việc sử dụng kiến trúc nào phụ thuộc vào nhu cầu cụ thể của ứng dụng và khả năng phát triển của bạn. Cả hai loại kiến trúc đều có ưu điểm và hạn chế riêng, và sự lựa chọn phụ thuộc vào tình huống cụ thể của dự án.