Microservices đã nhanh chóng trở thành kiến trúc phổ biến cho những công ty, tổ chức hiện đại. Một cách tổng quan, microservices là một kiến trúc xây dựng hệ thống phân tán giúp phát triển, triển khai và co giãn các dịch vụ riêng lẻ một cách độc lập; cho phép dễ dàng quản lý một ứng dụng lớn và thay đổi business nhanh chóng theo các yêu cầu.
Bên cạnh những khó khăn và thách thức, microservices cũng mang lại nhiều lợi ích mà nhà phát triển và các công ty công nghệ không thể chối từ. Bài viết này sẽ là câu trả lời tiếp theo cho câu hỏi Microservices có phải là "miền đất hứa"?
Easy to develop and maintain
Do tính chất tương đối nhỏ và đơn giản hơn ứng dụng monolithic nên các ứng dụng được xây dựng bằng kiến trúc microservices sẽ dễ dàng hơn trong việc phát triển và bảo trì. Các dịch vụ được isolate về business và data nên hoạt động và performance của dịch vụ này sẽ ít hoặc không ảnh hưởng đến toàn hệ thống. Trong trường hợp khi một tính năng cao tải, với hệ thống monolithic thì toàn bộ tài nguyên available của hệ thống sẽ bị sử dụng hết, dễ dẫn đến tình trạng downtime, thậm chí phải cần đến reset toàn bộ, trong khi với microservices, issue không ảnh hưởng tới toàn hệ thống và có thể được giải quyết bằng các giải pháp cục bộ.
Highly available
Tính sẵn sàng cao nói đến việc service luôn sẵn sàng trong nhiều điều kiện khác nhau (một instance bị crash, cao tải, không phản hồi…). Theo mô hình tiêu chuẩn, một hệ thống microservices thường được triển khai trên các nền tảng ảo hóa, một service được chạy song song trên nhiều runtime instance (Replica), hệ thống Container Orchestration sẽ kiểm tra tính sẵn sàng và điều phối request đến các instance đang available, và ngăn các request đến các instance có vấn đề cho đến khi instance này phục hồi.
Scalable
Khả năng có giãn của service mang lại hiệu quả cả về kinh tế và performance cho hệ thống. Tưởng tượng khi hệ thống thấp tải hoặc các service không yêu cầu quá nhiều tài nguyên, chúng ta có thể giảm cấu hình của từng instance hoặc giảm cả về số lượng instance để tối ưu chi phí. Khi hệ thống yêu cầu tài nguyên lớn để xử lý trong các trường hợp đặc biệt, hệ thống lại sẵn sàng tăng cấu hình từng instance hoặc tăng số lượng lớn các instance để đáp ứng tải.
Resilient
Khả năng phục hồi: Các nền tảng ảo hóa thường có cơ chế để kiểm tra sức khỏe từng phần hoặc cả hệ thống từ đó đảm bảo tự động khôi phục hoạt động của ứng dụng và hệ thống khi có vấn đề xảy ra, các vấn đề có thể đến từ nội hàm của dịch vụ như cao tải, crash ứng dụng, do người dùng xóa các instance hoặc các vấn đề lớn hơn như máy chủ vật lý gặp lỗi, cần chuyển sang node khác để hoạt động.
Fault-tolerant
Khả năng chịu lỗi: Khả năng này khá trừu tượng cho những người mới tiếp cận với microservices. Khả năng chịu lỗi có vẻ tương đồng với khả năng phục hồi, nhưng scope của những tính năng này không giống nhau. Khi các instance gặp lỗi, hệ thống cũng cần có khả năng handle được lỗi này. Nhưng không chỉ có vậy, nếu nhìn một cách tổng quát hơn, bất kì vấn đề nào của hệ thống microservices đều có thể dẫn đến khả năng ảnh hưởng đến business và dữ liệu. Mục đích cuối cùng của khả năng chịu lỗi là đảm bảo business ít hoặc không bị ảnh hưởng bởi các lỗi của hệ thống, bảo gồm các lỗi do logic và các lỗi do hạ tầng, kết nối. Các lỗi của hệ thống có thể kể đến như Slow Network, Service downtime, Connection timeout, Cross service transaction…
Increase Release Cycle
Do các business domain đã được chia nhỏ theo các service nên tốc độ phát triển có thể được gia tăng bằng cách triển khai nhiều nhóm cùng phát triển các domain của ứng dụng. Từ bài viết trước chúng ta cũng thấy được microservices khiến việc duplicate các effort lên là khá thường xuyên, nhưng khi đã có giải pháp để tối ưu thì tính linh hoạt của microservices được thể hiện rõ rệt. Do các ứng dụng tương đối nhỏ, ít phụ thuộc với nhau nên khả năng phát triển độc lập được gia tăng. Quá trình CI/CD được tích hợp liên tục mà không làm gián đoạn cả hệ thống trong thời gian dài.
Technology combination
Trước đây chúng ta thường thấy có những stack đi cùng với nhau như XAMMP, LAMP, WAMP vs MAMP trong phát triển ứng dụng web hoặc các giải pháp của .Net, C# thường gắn liền với hệ sinh thái của Microsoft. Nhưng giờ đây với sự phát triển của công nghệ nói chung và microservices nói riêng, các stack tương thích với nhau dễ dàng hơn nhiều, đa dạng chuẩn giao tiếp, protocol được phát triển và được hỗ trợ bởi nhiều ứng dụng như Rest API, gRPC, Messaging… Cả một hệ thống hoặc ứng dụng lớn có thể được triển khai đơn giản trên công nghệ container khi tất cả source code và các dependency đã được đóng gói trong một image duy nhất, rất tiện dụng. Hệ thống có thể kết hợp nhiều công nghệ, đa dạng ngôn ngữ lập trình cho các mục đích phù hợp, tối ưu hóa hệ thống.
Hardware/Resource Optimization
Nhờ công nghệ container mà chúng ta không cần phải triển khai cả một máy chủ ảo để chạy các ứng dụng theo cách truyền thống, các ứng dụng khi được viết bằng các ngôn ngữ phù hợp có thể chạy trên các cấu hình container nhỏ (0.25CPU/ 0.25 Gb RAM) hoặc thậm chí nhỏ hơn nữa, bao gồm cả các ứng dụng phía backend. Quá trình CI/CD trên các dịch vụ nhỏ cũng giúp tăng tốc và tối ưu về tốc độ phát triển. Do có thể chia nhỏ việc phát triển các dịch vụ trên các team/member nhỏ hơn nên việc phát triển cũng tối ưu về nguồn lực, mỗi team/member chịu trách nhiệm trên service của mình, giảm việc phải hiểu và debug cả project lớn và phải hiểu nhiều tech stack, language khác nhau.
Reusability
Khả năng tái sử dụng cao do các service được đóng gói cả code và dependency cùng với nhau, khi có bất cứ nhu cầu về triển khai lại các version code khác nhau, chỉ cần deploy lại image tương ứng, mà không cần build lại từ đầu. Cùng image đó có thể triển khai trên nhiều hạ tầng khác nhau, với chắc chắn cùng một phiên bản code, stable về business. “Write once, run everywhere”, chỉ cần máy chủ có triển khai công nghệ container thì microservices có thể triển khai trên bất kì hệ điều hành nào bao gồm cả Linux và Window.
Security
Các service có thể được tách biệt về code và cả data nên có thể che giấu được business phía sau, đảm bảo bảo mật về mặt dữ liệu và business. Các dịch vụ cũng không access được đến các secret, config của dịch vụ khác, đảm bảo isolate giữa các teams/members.
Kết
Qua cả hai bài viết, chúng ta đã có cái nhìn khá toàn diện về ưu/nhược điểm của kiến trúc microservices. Điều này sẽ giúp nhà phát triển đưa ra được quyết định tốt nhất khi xây dựng kiến trúc hệ thống.
Tác giả: Ethanol Tran - A member of Sunteco Team