Các mẫu thiết kế (design patterns) phổ biến trong kiến trúc Microservices.
1. Mẫu API Gateway (Cổng giao tiếp API)
Giải thích: API Gateway đóng vai trò là một lối vào duy nhất cho tất cả các yêu cầu từ phía client (ví dụ: ứng dụng di động, trình duyệt web). Thay vì client gọi trực tiếp đến từng microservice riêng lẻ, nó sẽ gửi yêu cầu đến API Gateway. Gateway sau đó sẽ định tuyến yêu cầu đến dịch vụ phù hợp, đồng thời có thể thực hiện các chức năng chung như xác thực, bảo mật, giới hạn tốc độ, và tổng hợp dữ liệu.
Use Case: Ứng dụng Thương mại điện tử hiển thị trang chi tiết sản phẩm
Bối cảnh: Một ứng dụng mua sắm trên điện thoại cần hiển thị thông tin đầy đủ của một sản phẩm khi người dùng chọn xem. Thông tin này bao gồm: mô tả sản phẩm, hình ảnh, giá hiện tại, số lượng hàng còn trong kho, và các đánh giá của khách hàng.
Vấn đề: Trong kiến trúc microservices, các thông tin này nằm rải rác ở các dịch vụ khác nhau:
Product Service(thông tin cơ bản),Pricing Service(giá),Inventory Service(tồn kho), vàReview Service(đánh giá). Nếu ứng dụng di động phải gọi riêng lẻ 4 dịch vụ này, nó sẽ tốn nhiều thời gian, tốn băng thông mạng và làm tăng độ phức tạp cho phía client.Giải pháp áp dụng API Gateway:
Ứng dụng di động chỉ gửi một yêu cầu duy nhất đến API Gateway:
GET /api/products/{id}/details.API Gateway nhận yêu cầu, xác thực người dùng (nếu cần).
Gateway sau đó gửi các yêu cầu song song đến
Product Service,Pricing Service,Inventory Service, vàReview Service.Gateway nhận phản hồi từ tất cả các dịch vụ này.
Gateway tổng hợp tất cả thông tin thành một phản hồi JSON duy nhất.
Gateway trả phản hồi tổng hợp này về cho ứng dụng di động.
Kết quả: Ứng dụng di động chỉ cần thực hiện một cuộc gọi mạng, giảm độ trễ, tiết kiệm pin và băng thông. Logic tổng hợp dữ liệu được ẩn khỏi client.
2. Mẫu Service Discovery (Khám phá Dịch vụ)
Giải thích: Trong môi trường microservices động, các phiên bản (instances) của dịch vụ có thể được tạo mới hoặc hủy bỏ liên tục, dẫn đến địa chỉ IP và cổng của chúng thay đổi thường xuyên. Service Discovery giúp các dịch vụ tự động tìm thấy nhau mà không cần cấu hình cứng địa chỉ IP. Nó thường bao gồm một Service Registry (sổ đăng ký dịch vụ) trung tâm, nơi các dịch vụ đăng ký vị trí của mình.
Use Case: Dịch vụ Đặt hàng gọi Dịch vụ Thanh toán trong môi trường đám mây
Bối cảnh:
Order Service(Dịch vụ Đặt hàng) cần gọiPayment Service(Dịch vụ Thanh toán) để xử lý giao dịch khi khách hàng đặt hàng. Hệ thống chạy trên nền tảng đám mây (ví dụ: Kubernetes) nơiPayment Servicecó thể có nhiều bản sao (instances) và được tự động mở rộng hoặc thu hẹp.Vấn đề:
Order Servicekhông thể biết trước địa chỉ IP và cổng của các instancePayment Serviceđang hoạt động vì chúng thay đổi động. Cấu hình cứng địa chỉ IP là không khả thi.Giải pháp áp dụng Service Discovery:
Khi các instance của
Payment Servicekhởi động, chúng tự động đăng ký địa chỉ IP và cổng của mình với Service Registry (ví dụ: Netflix Eureka hoặc HashiCorp Consul).Khi
Order Servicecần gọiPayment Service, nó hỏi Service Registry: "Cho tôi địa chỉ của dịch vụ Thanh toán".Service Registry trả về danh sách các địa chỉ IP và cổng của các instance
Payment Serviceđang hoạt động.Order Servicechọn một địa chỉ (thường sử dụng thuật toán cân bằng tải phía client) và thực hiện cuộc gọi trực tiếp đến instance đó.
Kết quả: Các dịch vụ có thể giao tiếp với nhau một cách linh hoạt và tin cậy ngay cả khi cơ sở hạ tầng mạng thay đổi liên tục. Việc mở rộng hoặc thu hẹp quy mô dịch vụ trở nên dễ dàng.
3. Mẫu Circuit Breaker (Cầu dao ngắt mạch)
Giải thích: Circuit Breaker là một pattern giúp ngăn chặn lỗi dây chuyền (cascading failures) trong hệ thống phân tán. Nó hoạt động giống như một cầu dao điện trong nhà. Khi một dịch vụ mà bạn đang gọi bị lỗi hoặc phản hồi quá chậm liên tục, Circuit Breaker sẽ "ngắt mạch", chặn các cuộc gọi tiếp theo đến dịch vụ đó trong một khoảng thời gian. Điều này giúp dịch vụ bị lỗi có thời gian phục hồi và ngăn chặn dịch vụ gọi bị treo hoặc quá tải tài nguyên.
Use Case: Hệ thống Ngân hàng xử lý giao dịch trong giờ cao điểm
Bối cảnh: Một hệ thống ngân hàng có
Transaction Service(Dịch vụ Giao dịch) gọi đếnFraud Detection Service(Dịch vụ Phát hiện Gian lận) để kiểm tra mỗi giao dịch trước khi phê duyệt.Vấn đề: Trong giờ cao điểm (ví dụ: ngày Black Friday), lượng giao dịch tăng đột biến.
Fraud Detection Servicebị quá tải và bắt đầu phản hồi rất chậm hoặc trả về lỗi timeout. NếuTransaction Servicecứ tiếp tục gửi yêu cầu và chờ đợi, các luồng (threads) xử lý của nó sẽ bị chiếm dụng hết, dẫn đến toàn bộ hệ thống giao dịch bị chậm hoặc sập (lỗi dây chuyền).Giải pháp áp dụng Circuit Breaker:
Transaction Servicesử dụng thư viện Circuit Breaker (ví dụ: Resilience4j hoặc Hystrix) để bao bọc các cuộc gọi đếnFraud Detection Service.Khi Circuit Breaker phát hiện tỷ lệ lỗi hoặc timeout từ
Fraud Detection Servicevượt quá một ngưỡng nhất định (ví dụ: 50% lỗi trong 10 giây), nó chuyển sang trạng thái Open (Ngắt).Ở trạng thái Open, mọi cuộc gọi tiếp theo từ
Transaction ServiceđếnFraud Detection Servicesẽ bị chặn ngay lập tức mà không cần gửi đi.Transaction Servicesẽ nhận được một phản hồi lỗi nhanh chóng hoặc một giá trị mặc định (ví dụ: "Tạm thời không thể kiểm tra gian lận, vui lòng thử lại sau" hoặc phê duyệt giao dịch với hạn mức thấp hơn).Sau một khoảng thời gian định trước, Circuit Breaker chuyển sang trạng thái Half-Open và cho phép một vài yêu cầu đi qua để kiểm tra xem
Fraud Detection Serviceđã phục hồi chưa.
Kết quả: Hệ thống giao dịch chính không bị sập do lỗi của dịch vụ phụ thuộc. Tài nguyên được giải phóng, và trải nghiệm người dùng được duy trì (dù có thể ở mức độ giảm cấp) thay vì chờ đợi vô vọng.
4. Mẫu Saga (Quản lý giao dịch phân tán)
Giải thích: Trong microservices, mỗi dịch vụ có cơ sở dữ liệu riêng, làm cho việc quản lý các giao dịch trải dài qua nhiều dịch vụ (distributed transactions) trở nên khó khăn vì không thể sử dụng chuẩn ACID (Atomicity, Consistency, Isolation, Durability) truyền thống. Pattern Saga giải quyết vấn đề này bằng cách chia một giao dịch kinh doanh lớn thành một chuỗi các giao dịch cục bộ nhỏ hơn. Mỗi giao dịch cục bộ cập nhật cơ sở dữ liệu của một dịch vụ và kích hoạt giao dịch tiếp theo thông qua sự kiện (event) hoặc tin nhắn. Nếu một bước thất bại, Saga sẽ thực hiện các giao dịch bù trừ (compensating transactions) để hoàn tác các thay đổi đã thực hiện ở các bước trước đó, đảm bảo tính nhất quán cuối cùng (eventual consistency) của dữ liệu.
Use Case: Quy trình Đặt vé máy bay trực tuyến
Bối cảnh: Một quy trình đặt vé máy bay bao gồm 3 bước chính được xử lý bởi các dịch vụ khác nhau:
Booking Service: Giữ chỗ trên chuyến bay.Payment Service: Thực hiện trừ tiền từ thẻ của khách hàng.Notification Service: Gửi email xác nhận vé và thông tin chuyến bay.
Vấn đề: Cả 3 bước này phải cùng thành công hoặc cùng thất bại để đảm bảo tính nhất quán dữ liệu. Ví dụ, nếu thanh toán thành công nhưng không gửi được email xác nhận, hệ thống sẽ ở trạng thái không nhất quán. Không thể sử dụng giao dịch cơ sở dữ liệu phân tán (như 2PC) vì hiệu năng kém và ghép nối chặt chẽ các dịch vụ.
Giải pháp áp dụng Saga (Kiểu Choreography - Điều phối dựa trên sự kiện):
Bước 1: Khách hàng yêu cầu đặt vé.
Booking Servicetạo một bản ghi đặt chỗ với trạng thái "PENDING" và phát ra sự kiệnBookingCreated.Bước 2:
Payment Servicelắng nghe sự kiệnBookingCreated, thực hiện trừ tiền.Nếu thành công, nó phát ra sự kiện
PaymentProcessed.Nếu thất bại (ví dụ: thẻ hết tiền), nó phát ra sự kiện
PaymentFailed.
Bước 3 (Kịch bản thành công):
Notification Servicelắng nghePaymentProcessed, gửi email, và phát ra sự kiệnNotificationSent.Booking Servicelắng ngheNotificationSentvà cập nhật trạng thái đặt chỗ thành "CONFIRMED".
Bước 4 (Kịch bản thất bại - Giao dịch bù trừ):
Giả sử
Payment Servicethành công nhưngNotification Servicebị lỗi khi gửi email.Notification Servicesẽ phát ra sự kiệnNotificationFailed.Payment Servicelắng ngheNotificationFailedvà thực hiện giao dịch bù trừ: hoàn lại tiền cho khách hàng. Sau đó phát ra sự kiệnPaymentRefunded.Booking Servicelắng nghePaymentRefunded(hoặcPaymentFailedtừ bước 2) và thực hiện giao dịch bù trừ: hủy bỏ việc giữ chỗ và cập nhật trạng thái thành "CANCELLED".
Kết quả: Hệ thống đảm bảo tính nhất quán cuối cùng của dữ liệu. Nếu có bất kỳ lỗi nào xảy ra, các hành động đã thực hiện sẽ được hoàn tác một cách có trật tự, tránh tình trạng dữ liệu bị sai lệch giữa các dịch vụ.
Tác giả: Bạch Ngọc Toàn
Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.
Tags:
Bài viết liên quan
Lộ trình Fullstack .NET Developer 2026
Chào bạn, bước sang năm 2026, lộ trình của một Fullstack .NET Developer đã có những thay đổi quan trọng để thích nghi với sự lên ngôi của AI, điện toán đám mây và phiên bản .NET 10 (LTS) vừa ra mắt cuối năm 2025.
Đọc thêm
TỔNG QUAN LÝ THUYẾT & THÀNH PHẦN CỐT LÕI SYSTEM DESIGN
Các lý thuyết cốt lõi trong System Design
Đọc thêm
Cẩm nang Big-O: Thước đo hiệu năng thuật toán trong C#
Hiểu rõ Big-O từ O(1) đến O(n!) qua ví dụ C# thuần. Bí quyết tối ưu code, chọn đúng cấu trúc dữ liệu để hệ thống luôn chạy nhanh và ổn định.
Đọc thêm
Bản Đồ Tư Duy Cho Dev: Giải Mã Cấu Trúc Dữ Liệu & Giải Thuật Cốt Lõi
Đọc thêm
Hướng dẫn Bind Jenkins vào IIS trên Windows bằng Reverse Proxy
Cho phép truy cập Jenkins từ một subdomain (ví dụ jenkins.tedu.com.vn) thay vì phải gõ http://localhost:8080.
Đọc thêm
Hiểu về AI, LLM, RAG và Agentic RAG trong 15 phút
Trong vài năm gần đây, trí tuệ nhân tạo (AI) đã bùng nổ mạnh mẽ và trở thành tâm điểm của cả thế giới công nghệ. Nhưng đi kèm với nó là hàng loạt khái niệm mới như LLM, RAG, hay Agentic RAG khiến nhiều người mới bắt đầu cảm thấy lúng túng.
Đọc thêm
Hướng dẫn tự triển khai N8N trên CentOS bằng Docker Compose và NGINX
N8N là công cụ mã nguồn mở cho phép bạn tự động hóa quy trình làm việc (workflow automation) và tích hợp nhiều dịch vụ khác nhau mà không cần phải lập trình.
Đọc thêm
Hướng dẫn phân tích độ phức tạp thuật toán chi tiết
Độ phức tạp của giải thuật là một cách để đánh giá hiệu quả của một giải thuật dựa trên hai yếu tố chính là độ phức tạp thời gian và độ phức tạp không gian.
Đọc thêm
Bài 6. Các thao tác với XPath và Selector trong Selenium
Bài viết này hướng dẫn bạn làm việc XPath và Css Selector trong Selenium.
Đọc thêm
Bài 5. Các thao tác với Web Browser trong Selenium
Bài viết này hướng dẫn bạn làm việc sâu Web Browser trong Selenium.
Đọc thêm