Weekly MicroClosure #3: Ưu điểm và nhược điểm của kiến trúc microservice

Về ưu điểm

1> Hỗ trợ CI/CD cho các ứng dụng lớn và phức tạp: ENABLES THE CONTINUOUS DELIVERY AND DEPLOYMENT (CI/CD) OF LARGE, COMPLEX APPLICATIONS

  • Đảm bảo khả năng kiểm thử của CI/CD: Automation Testing đóng vai trò là yếu tố then chốt trong quy trình CI/CD, đặc biệt khi ứng dụng được phân chia thành các Microservice. Việc chia nhỏ ứng dụng thành các service nhẹ gọn giúp tối ưu hóa hiệu quả của Automation Testing, cho phép thực thi các bài kiểm tra nhanh hơn và hiệu quả hơn. Nhờ vậy, tổng thể ứng dụng được đảm bảo chất lượng cao hơn, giảm thiểu nguy cơ lỗi và sự cố.
  • Đảm bảo khả năng triển khai của CI/CD: Với kiến trúc Microservice, mỗi service giờ đây được triển khai tự chủ, hoàn toàn độc lập với các service khác. Nhờ vậy, các nhóm phát triển có thể cập nhật riêng lẻ các service mà không cần đồng bộ hóa với nhau, giúp tăng tốc độ phát triển và vận hành ứng dụng. Ví dụ, nhóm phát triển dịch vụ thanh toán có thể triển khai bản cập nhật mới mà không cần chờ đợi nhóm phát triển dịch vụ giao hàng.
  • Cho phép các đội phát triển hoạt động độc lập và ít liên kết với nhau hơn: Với Microservice, mỗi đội dev tự chủ hoàn toàn trong việc vận hành toàn bộ vòng đời của hệ thống chức năng liên quan, từ khâu thiết kế, phát triển đến triển khai và vận hành. Nhờ sự tự do và linh hoạt này, các đội dev có thể đẩy nhanh tốc độ phát triển ứng dụng một cách đột phá.

Hình 1 (Bing Image Creator, prompt: ENABLES THE CONTINUOUS DELIVERY AND DEPLOYMENT (CI/CD) OF LARGE, COMPLEX APPLICATIONS)

Và khi một dự án được áp dụng CI/CD vào sẽ mang đến các lợi ích: 

  • Tăng tốc độ ra mắt sản phẩm, cho phép doanh nghiệp phản ứng nhanh chóng với phản hồi từ khách hàng.
  • Nâng cao độ tin cậy của service
  • Tăng cường sự gắn kết và hiệu quả làm việc của nhân viên vì họ có thể tập trung vào những công việc sáng tạo để phát triển các tính năng có giá trị thay vì fix bug.

2> Mỗi service đều nhỏ và dễ bảo trì: EACH SERVICE IS SMALL AND EASILY MAINTAINED

Microservice mang đến khả năng bảo trì đơn giản và hiệu quả, giúp dev dễ dàng thấu hiểu mã nguồn của từng service nhỏ gọn. Code base nhỏ khiến IDE đỡ chậm và lag, ứng dụng cũng build/ khởi động nhanh hơn và từ đó cũng khiến dev trở nên năng suất hơn.

Hình 2 (Bing Image Creator, prompt: EACH SERVICE IS SMALL AND EASILY MAINTAINED)

3> Mỗi service có thể mở rộng một cách độc lập: SERVICES ARE INDEPENDENTLY SCALABLE

Mang đến khả năng mở rộng linh hoạt và hiệu quả, cho phép admin tùy chỉnh tài nguyên cho từng service độc lập, đáp ứng nhu cầu riêng biệt của từng service. Nhờ vậy, việc mở rộng ứng dụng diễn ra độc lập hoàn toàn, tối ưu hóa tài nguyên và giảm thiểu chi phí. Ví dụ, dịch vụ thanh toán của một ứng dụng thương mại điện tử có thể được mở rộng bằng cách thêm máy chủ GPU để tăng tốc độ xử lý thanh toán, trong khi dịch vụ giao hàng có thể được mở rộng bằng cách thêm máy chủ RAM cao để lưu trữ dữ liệu giao hàng.

Hình 3 (Bing Image Creator, prompt: SERVICES ARE INDEPENDENTLY SCALABLE)

4> Khả năng cô lập lỗi tốt hơn: BETTER FAULT ISOLATION

Sở hữu khả năng cô lập lỗi vượt trội, giúp hạn chế tác động của lỗi đến các phần khác của ứng dụng. Ví dụ, nếu lỗi rò rỉ bộ nhớ xảy ra trong service thanh toán, các service khác như giao hàng và quản lý tài khoản vẫn hoạt động ổn định. Nhờ vậy, người dùng chỉ gặp sự cố với chức năng thanh toán và hệ thống có thể tiếp tục hoạt động, tối ưu hóa thời gian sửa lỗi. Để so sánh, nếu một thành phần của kiến trúc monolith hoạt động lỗi sẽ khiến cả hệ thống bị gián đoạn. 

Hình 4 (Bing Image Creator, prompt: BETTER FAULT ISOLATION)

5> Dễ dàng thử nghiệm và thích nghi với công nghệ mới: EASILY EXPERIMENT WITH AND ADOPT NEW TECHNOLOGIES

Microservice mang đến khả năng tự do thử nghiệm và áp dụng công nghệ tiên tiến, giúp dev tự do lựa chọn ngôn ngữ và framework tối ưu nhất cho từng service. Nhờ vậy, việc thử nghiệm công nghệ mới diễn ra nhanh chóng và hiệu quả, giảm thiểu rủi ro ảnh hưởng đến toàn bộ dự án. Nếu việc thử nghiệm một công nghệ mới không thành công, bạn có thể hủy bỏ công việc đó mà không gây nguy hiểm cho toàn bộ dự án.

Hình 5 (Bing Image Creator, prompt: EASILY EXPERIMENT WITH AND ADOPT NEW TECHNOLOGIES)

 

 

Về nhược điểm

1> Không có công thức chung để phân tách các Service: FINDING THE RIGHT SERVICES IS CHALLENGING

Xác định các dịch vụ thành phần phù hợp là một thách thức lớn khi áp dụng kiến trúc microservice. Hiện tại, không có phương pháp rõ ràng và hiệu quả để chia nhỏ hệ thống một cách tối ưu. Nếu việc chia nhỏ không được thực hiện hiệu quả, nó có thể dẫn đến kiến trúc distributed monolith, gồm các dịch vụ cần được triển khai cùng nhau. Kiến trúc này gặp phải những hạn chế của cả kiến trúc monolith và microservice, ảnh hưởng đến hiệu quả và tính linh hoạt của hệ thống.

Hình 6 (Bing Image Creator, prompt: FINDING THE RIGHT SERVICES IS CHALLENGING)

 

2> Vận hành hệ thống phức tạp hơn: DISTRIBUTED SYSTEMS ARE COMPLEX

Kiến trúc microservice đặt ra yêu cầu cao hơn cho hệ thống giao tiếp nội bộ giữa các dịch vụ so với hệ thống giao tiếp truyền thống. Các dịch vụ cần được thiết kế để đảm bảo khả năng chịu lỗi khi các dịch vụ khác trục trặc hoặc thời gian phản hồi chậm.

Sử dụng nhiều dịch vụ trong cùng một trường hợp ứng dụng tăng mức độ thử thách cho lập trình viên khi phải làm việc với công nghệ đa dạng. Mỗi dịch vụ riêng biệt sở hữu cơ sở dữ liệu riêng, dẫn đến thách thức trong việc duy trì tính nhất quán dữ liệu, đảm bảo giao dịch và quá trình truy vấn diễn ra hiệu quả giữa các dịch vụ.

Kiến trúc microservice dẫn đến khối lượng công việc vận hành tăng cao, đòi hỏi kỹ năng vận hành chuyên sâu và việc áp dụng các giải pháp tự động hóa như Netflix Spinnaker, Docker Swarm, Kubernetes để vận hành và quản lý nhiều bản sao của cùng một dịch vụ, cũng như các công nghệ container khác.

Hình 7 (Bing Image Creator, prompt: DISTRIBUTED SYSTEMS ARE COMPLEX)

3> Việc triển khai liên ứng dụng cần chính xác: DEPLOYING FEATURES SPANNING MULTIPLE SERVICES NEEDS CAREFUL COORDINATION

Triển khai các tính năng liên quan đến nhiều dịch vụ là một khó khăn lớn trong kiến trúc microservice. Việc triển khai đòi hỏi sự đồng bộ chặt chẽ giữa các đội ngũ phát triển để đảm bảo tính chính xác và hiệu quả. Chiến lược triển khai cần được xây dựng dựa trên mối liên hệ giữa các dịch vụ, khác biệt hoàn toàn so với kiến trúc monolith, nơi việc triển khai thay đổi cho nhiều thành phần diễn ra nhanh chóng và đơn giản. Nếu không có sự đồng bộ chặt chẽ, việc triển khai có thể dẫn đến lỗi và gián đoạn, ảnh hưởng đến trải nghiệm người dùng.

Hình 8 (Bing Image Creator, prompt: DECIDING WHEN TO ADOPT NEW TECHNOLOGY IS DIFFICULT)

4> Quyết định khi nào chuyển sang Microservice khá là khó khăn: DECIDING WHEN TO ADOPT IS DIFFICULT

Lựa chọn thời điểm phù hợp để áp dụng kiến trúc microservice là một thách thức quan trọng trong quá trình phát triển ứng dụng. Ở giai đoạn đầu, khi ứng dụng còn đơn giản và chưa đối mặt với nhiều thách thức về độ phức tạp, việc áp dụng kiến trúc microservice có thể cản trở sự phát triển nhanh chóng, đặc biệt đối với các công ty khởi nghiệp cần tập trung vào việc phát triển mô hình kinh doanh. Thay vào đó, việc sử dụng kiến trúc monolith đơn giản sẽ phù hợp hơn.

 

Tuy nhiên, khi ứng dụng phát triển và trở nên phức tạp hơn, việc chia nhỏ ứng dụng thành hệ thống các dịch vụ thành phần có thể giúp giải quyết các vấn đề hiệu quả. Việc áp dụng kiến trúc microservice vào giai đoạn này giúp tối ưu hóa hiệu quả và khả năng mở rộng, nhưng cũng đi kèm với thách thức về tái cấu trúc code do các phần phụ thuộc phức tạp.

 

Hình 9 (Bing Image Creator, prompt: DECIDING WHEN TO ADOPT NEW TECHNOLOGY IS DIFFICULT)

 

Điều quan trọng cần lưu ý là kiến trúc microservice sở hữu nhiều điểm mạnh nhưng cũng đi kèm với một số điểm yếu cần được cân nhắc kỹ lưỡng trước khi triển khai. Việc áp dụng kiến trúc này không nên được thực hiện một cách vội vàng bởi nó đòi hỏi sự đầu tư về kỹ năng và quy trình quản lý. Tuy nhiên, đối với các ứng dụng phức tạp như ứng dụng web hướng tới người tiêu dùng hoặc ứng dụng SaaS, kiến trúc microservice thường là lựa chọn tối ưu để giải quyết các vấn đề về độ phức tạp và khả năng mở rộng.

 

Nhiều trang web nổi tiếng như eBay, Amazon.com, Groupon và Gilt đã chuyển đổi thành công từ kiến trúc monolith sang kiến trúc microservice, minh chứng cho hiệu quả và tiềm năng của kiến trúc này trong việc nâng cao hiệu suất và khả năng thích ứng cho các ứng dụng phức tạp.