Bộ công cụ để xây dựng một hệ thống microservices

Microservices… đúng là buzzword mà, nghe hoài nhưng vẫn chưa biết là gì? 

Thay vì thiết kế hệ thống theo cách truyền thống là tất cả nghiệp vụ đến giao diện web đều được chạy chung trên một process, thiết kế microservices nghĩa là chia nhỏ ra thành cả vài chục đến vài trăm services (có thể là dịch vụ – services, tiến trình – processes, chương trình – applications) – mỗi services sẽ xử lý một nghiệp vụ cụ thể nào đó và các services này có thể chạy trên nhiều máy tính khác nhau, nói chuyện với nhau thông qua đường truyền mạng.

Image result for microservices diagram

Hình 1: Mô hình microservices của Uber

Với các bạn mới trong lĩnh vực này, các bạn có thể đọc thêm điểm lợi và bất lợi của microservices ở đây và ở đây. Ngoài ra các bạn có thể tham khảo một loạt các link từ cơ bản đến chuyên sâu tôi để bên dưới nhé.

Vậy khi thiết kế hệ thống microservices, tôi phải quan tâm những gì nào?

  • Bởi vì có thể có cả nghìn services, các lập trình viên trong cùng đội rất dễ bị đau đầu vì phải nhớ hay cấu hình cả vài chục đến vài trăm địa chỉ IP/cổng kết nối, đặc biệt là các bạn viết frontend đôi khi phải làm việc với cả chục services chỉ trong một ứng dụng. Ngoài ra, mỗi dịch vụ lại cần có cơ chế xác thực bảo mật riêng, cơ chế logging lại lịch sử truy cập. Hoặc điều gì sẽ xảy ra khi một services được dùng lạm dụng quá nhiều ở một client nào đó, trong khi ở mô hình microservices thì một service có thể được dùng bởi rất nhiều services khác, việc lạm dụng này sẽ dẫn đến hệ thống mất tính ổn định nghiêm trọng. Để giải quyết vấn đề này, ta sẽ cần tổng hợp lại để cho bên ngoài chỉ cần nói chuyện với một đại diện thôi là đủ, dịch vụ này sẽ điều hướng các requests gởi đi từ client đến các services cần thiết. Ngoài ra, mọi chức năng như xác thực bảo mật, logging, hay api rate limiting đều có thể được handle bởi vị đại diện này. Vị này trong bộ môn microservices thì người ta gọi là API Gateway đó các bạn ^^ Keyword: API GatewayImage result for api gateway
  • Một trong những điểm nổi bật của microservics là khả năng release một service mới, hay một bản cập nhật của service rất nhanh mà không cần phải ngắt toàn bộ hệ thống như mô hình monolithic truyền thống. Từ trước tới nay ở phần backend của hệ thống thường sẽ được giao tiếp thông qua một địa chỉ IP được set cố định, vd service A có địa chỉ IP là 192.168.1.125, services B có IP là 192.168.1.126, hai services này sẽ luôn lưu thông tin như vậy để nói chuyện với nhau. Nếu service A cần được nâng cấp thì ta có thể thấy phải ngắt service A để cài đặt lại. Thay vì đó, nếu có một cơ chế để có thể setup lên một service A dưới địa chỉ IP khác vd 192.168.1.127, rồi sau đó báo cho service B được địa chỉ IP mới của service A thì chúng ta có thể nâng cấp không downtime. Chưa kể đến trong môi trường thực tế, đa số sẽ thiết kế để các service tự scale thêm hoặc giảm bớt instances tùy theo tải để tiết kiệm tối đa chi phí đồng thời vẫn đảm bảo được tốc độ. Để làm được điều đó, ta sẽ cần một cơ chế để tự động phát hiện dịch vụ mới, hay tự động phát hiện một node mới trong một service cluster. Trong bộ môn microservices thì chú này được gọi là Service Discovery nhé các bạn. Lưu ý là có hai loại client-side và server-side service discovery. Keyword: Service Discovery
  • Thiết lập hàng trăm dịch vụ nhỏ – microservices – sẽ mất rất nhiều công sức nếu làm bằng tay. Chúng ta sẽ cần một cơ chế nhanh và tiện lợi để có thể deploy và có thể rollback khi gặp vấn đề. Trong vài năm trở lại đây thì docker nổi lên như một hiện tượng và đã làm thay đổi rất nhiều cách mà chúng ta deploy ứng dụng. Docker là một chương trình ảo hóa ở lớp hệ điều hành, và đảm bảo cho bạn là nếu ở môi trường local chạy được thì khi deploy lên production cũng sẽ chạy được như vậy mà không cần tốn thêm công đoạn cài đặt nào phức tạp cả. Ngoài Docker thì chúng ta còn có Rocket, ra đời muộn hơn nhưng tập trung vào tính bảo mật ngay từ thiết kế ban đầu. Tuy nhiên hiện nay Docker cũng đã khắc phục được rất nhiều nhược điểm trước đó. Keyword: Container, docker
  • Container orchestration framework: quản lý việc khởi tạo, thêm mới hay xóa đi các container hoặc tập các containers trong mạng lưới. Trước đây chúng ta có Docker swarm hay Mesosphere nhưng mà bây giờ thì anh Kubernetes được chống lưng bởi Google đang nổi lên ở vị trí số một vì các tính năng quá ưu việt. Nói nôm na là nếu bạn có 5 servers, thì kubernetes sẽ giúp bạn tạo thành một cluster, và deploy container trên cluster này bằng cách nói cho kubernetes biết container của bạn sẽ cần bao nhiêu CPU / RAM. Dựa vào trình quản lý tài nguyên mà kubernetes sẽ biết để chọn server còn trống resource để khởi tạo lên container. Nói đơn giản là vậy nhưng bộ môn này thâm sâu không lường. Các bạn có thể từ từ ngâm cứu thêm hoặc đợi bài viết sau của tôi hén. Keyword: container orchestration, kubernetes, docker swarm, mesosphere
  • Nào, bây giờ đến cái hay nhất ở kiến trúc microservices. Trong microservices, các services nói chuyện với nhau thông qua network, mà network thì các bạn đều biết là sẽ có lúc bị chậm hoặc nghẽn. Do đó tính đúng đắn của một giao dịch (transaction) sẽ rất khó được đảm bảo. Trong bộ môn microservices, chúng ta có một chàng rất chăm chỉ và trung thực tên là service mesh chuyên lo hạ tầng, đảm bảo việc liên lạc giữa các service là nhanh và ổn định nhất có thể. Ngoài ra, anh ta còn hào phóng làm hết tất cả các công việc sau:
    • Load balancing: phân tải cho các service
    • Encryption: từng service không cần phải handle việc encrypt / decrypt các request nữa (vd hỗ trợ SSL).
    • Xác thực bảo mật: authentication và authorization
    • Hỗ trợ circuit breaker pattern: chia tách cụm nodes bị lỗi và từ từ đưa lại vào sử dụng khi kiểm chứng được tính ổn định của các cụm đó (requests sẽ không được gởi tới các cụm bị chia tách nữa cho tới khi ổn định trở lại)
    • Điều hướng tải một cách thông minh, hỗ trợ các tính năng như mirror traffic (test tải thật từ production trước khi deploy), shadow traffic (hỗ trợ A/B testing, điều hướng một số request vào phiên bản mới hơn), rate limiting để đảm bảo các service không bị lạm dụng bởi một client riêng lẻ nào.
    • Ngoài ra một tính năng rất tuyệt vời là tracing và monitoring logs. Với hàng trăm dịch vụ được chạy đồng thời bạn sẽ cần có cơ chế để giới hạn và xác định đúng vị trí bị lỗi để khắc phục một cách nhanh nhất.
    • Trong bộ môn này, với sự ra đời phiên bản production chính thức 1.0, itsio đã trở thành hiện tượng. Cuộc đời của lập trình viên đã trở nên tốt đẹp hơn nhiều với sự kết hợp của itsio trên nền tảng kubernetes.
    •  Keyword: Service Mesh, itsio, mirror trafific, shadow traffic

Lắp súng ống vào bắn nào, tổng hợp lại danh sách khái niệm bạn cần nắm để có thể thiết kế một hệ thống microservices đúng chuẩn thế hệ mới nhất đây 😀

  1. API Gateway
  2. Service Discovery
  3. Container
  4. Container Orchestration
  5. Service Mesh

Bonus: bạn có thể đã nghe cụm từ này vò vò quanh tai rồi mà chưa biết nó là gì? Để thiết kế một service đúng chuẩn bạn có thể tuân theo 12 nguyên tắc như được đề cập ở link sau original 12-factors page Hẹn bạn ở bài viết sau tôi sẽ giải thích rõ hơn.

Bonus 2: Các bài viết tham khảo cực kì hay về microservices

Chúc các bạn may mắn và nhớ ghé lại để xem các bài viết nóng hổi tiếp theo cùng chủ đề nhé!

Facebook Notice for EU! You need to login to view and post FB Comments!
%d bloggers like this: