Hiểu microservices — kiến trúc hệ thống phần mềm cực đỉnh

Với sự phát triển mạnh mẽ của công nghệ hiện nay, phần mềm ngày càng lớn, nhiều người dùng hơn, dữ liệu siêu nhiều. Thì với kiến thức phát triển công nghệ cũ đã không còn tối ưu được nữa. Vì vậy đã dẫn tới giải pháp microservices. Qua bài này mình sẽ hướng dẫn cách mà mình tiếp cận một kiến thức mới và giới thiệu microservices cho bạn đọc nghe một cách dễ hiểu nhất nhé.

Trước khi vào nội dung chính, mình sẽ chia sẻ cách để các bạn có thể tiếp cận kiến thức mới, công nghệ mới mà không phải đi vào lối mòn học vẹt. Trước khi học 1 cái gì đó bạn chỉ cần trả lời được câu hỏi:

“Dùng cái này sẽ giúp mình giải quyết được vấn đề gì?"

Nghe thì có thể một số bạn mới chưa hình dung ra được. Nhưng trong bài viết này mình sẽ tiếp cận theo hướng trên làm mẫu nhé.

Tại sao lại cần dùng microservices?

Trước khi có khái niệm microservices thì phần mềm trên thế giới và cả ở Việt Nam đều phát triển theo kiến trúc Monolith (Nguyên khối). Vậy kiến trúc Monolith là gì?

Kiến trúc Monolith chính là những gì lập trình viên chúng ta đang code. Gom toàn bộ mọi chức năng vào 1 project. Nhiều bạn học mô hình các kiểu sẽ bảo là ơ em có chia ra database này, chia ra đối tượng này, chia ra view này, controller này. Nhưng không các bạn ạ, cho dù có chia nhỏ ra các modules chức năng, chia nhỏ ra như nào thì cuối cùng nó vẫn nằm chung trong 1 project lớn.

Các ứng dụng Monolith thường rất lớn — thường sẽ có size hơn 100.000 dòng code. Trong một số trường hợp thậm chí có hơn một triệu dòng code

Nếu bạn chưa tưởng tượng 100.000 dòng code nhiều cỡ nào thì bạn hãy nhìn vào bài tập, dự án khó nhất mà bạn nhận được trong đại học. Có khi nó chưa đạt đến 2000 dòng code đâu nhé.

Mới 55 dòng thôi đã gây lú cực mạnh rồi nhéMới 55 dòng thôi đã gây lú cực mạnh rồi nhé

Vì vậy nên kiến trúc Monolith sẽ bộc lộ khuyết điểm khi ứng dụng ngày một to dần ra. Điển hình như:

  • Vài tháng mới nâng cấp một lần vì tất cả modules đều gom lại với nhau, khi muốn nâng cấp, ta phải deploy lại toàn bộ (Đây là điểm yếu cực mạnh trong thời đại cạnh tranh công nghệ). Nếu bạn sử dụng một phần mềm cập nhật liên tục mà phải bảo trì 4–6 tiếng sẽ như thế nào? Không cập nhật thì lại không đáp ứng được sự thay đổi liên tục của công nghệ.

  • Debug và phát triển cực kỳ khó: Điều này chắc không cần bàn cãi nhiều. Nếu phần mềm 100.000 dòng code và liên kết chặt chẽ với nhau trong 1 project lớn thì bạn debug khoai hay debug khỏe :))). Điều đó cũng tương tự như việc phát triển và ứng dụng công nghệ mới.

Microservices là người hùng cứu cánh

Monolith sang MicroservicesMonolith sang Microservices

Từ hình trên các bạn có thể thấy, Monolith tương tự một hình lập phương nguyên khối. Để có thể phát triển khối lập phương đó lên chỉ có thể đập vỡ hoặc đè lên chứ không tài nào rút phần nào ra khỏi cái khối đó được. Tuy nhiên, Microservices giúp chia các khối đó ra thành từng khối lập phương nhỏ hơn. Từ đó vừa có thể ghép được thành khối lập phương như Monolith vừa có thể phát triển thành khối bự hơn hoặc đa dạng hơn.

Ứng dụng xây theo Monolith — Một ứng dụng sẽ chứa hết toàn bộ chức năngỨng dụng xây theo Monolith — Một ứng dụng sẽ chứa hết toàn bộ chức năng

Ứng dụng microservices chia ứng dụng thành từng phần nhỏ và tương tác với nhau qua messageỨng dụng microservices chia ứng dụng thành từng phần nhỏ và tương tác với nhau qua message

Ưu điểm của Microservices so với Monolith

Hiện nay các ứng dụng lớn trên thế giới và liên tục update như facebook, linkedin, … thì việc gom toàn bộ ứng dụng vào một khối với kiến trúc Monolith sẽ làm cho việc nâng cấp ngày càng khó khăn và tốn kém. Vì vậy các ứng dụng lớn đã ứng dụng thiết kế hệ thống bằng kiến trúc Microservices, tách ứng dụng ra thành từng service nhỏ. Mỗi service quản lý một cơ sở dữ liệu riêng, nằm trên một server riêng, tách biệt hoàn toàn với nhau.

  • Giúp việc scale up, scale down dễ dàng hơn. Ví dụ một ứng dụng đặt vé xem phim. Nếu số lượng đặt vé nhiều gây quá tải bạn chỉ cần nâng cấp server cho service liên quan đến việc đặt vé (Ngược lại, có thể giảm server khi cần thiết). Với công nghệ cloud, mọi thứ đều được nâng cấp dễ dàng bằng cái click chuột. Monolith thì không làm được điều này.

  • Nếu một service bị lỗi, toàn bộ hệ thống vẫn hoạt động bình thường và chúng ta chỉ cần sửa lỗi tập trung vào service đó. Nhưng với Monolith, một module bị lỗi sẽ làm sập toàn bộ hệ thống.

  • Không giới hạn ngôn ngữ. Các service nằm tách biệt hoàn toàn với nhau, chúng có thể xử lý bằng ngôn ngữ lập trình riêng, database riêng. Ví dụ service xử lý ảnh có thể viết bằng C++, service tổng hợp data có thể viết bằng Python, …

Anh hùng nào cũng có điểm yếu

  • Các module giao tiếp qua mạng nên có thể tốc độ không cao bằng monolith. Ngoài ra, mỗi module phải tự giải quyết các vấn đề về bảo mật, transaction, lỗi kết nối, quản lý log files.

  • Cần một đội ngũ ngon lành để thiết kế và triển khai kiến trúc này.

Kết luận

Bằng việc hiểu quá trình phát triển công nghệ, tại sao người ta lại dùng Microservices thay cho Monolith. Câu hỏi: “Dùng cái này sẽ giúp mình giải quyết được vấn đề gì?" sẽ giúp bạn hiểu được cái cốt lõi nền tảng của nó. Từ đó việc triển khai sẽ dễ dàng hơn rất nhiều vì bạn đã có bức tranh rõ ràng.

Happy Coding!