Saga Pattern
Saga Pattern là một mô hình thiết kế được sử dụng trong các hệ thống phân tán (distributed systems) để quản lý các giao dịch phức tạp, đặc biệt khi không thể sử dụng các giao dịch ACID truyền thống (Atomicity, Consistency, Isolation, Durability). Nó được áp dụng phổ biến trong kiến trúc microservices để đảm bảo tính nhất quán dữ liệu giữa các dịch vụ mà không cần khóa tài nguyên dài hạn.
1. Saga Pattern là gì?
Saga là một chuỗi các giao dịch cục bộ (local transactions), trong đó mỗi giao dịch được thực hiện bởi một dịch vụ riêng biệt. Nếu một bước thất bại, Saga sẽ thực hiện các thao tác bù (compensating transactions) để hoàn tác những thay đổi đã thực hiện trước đó, đảm bảo tính nhất quán.
Saga chia thành hai loại chính:
Choreography: Các dịch vụ tự phối hợp với nhau thông qua việc gửi và nhận sự kiện (event-driven). Không có trung tâm điều phối.
Orchestration: Có một dịch vụ trung tâm (orchestrator) điều phối các bước của Saga, ra lệnh cho các dịch vụ khác thực hiện giao dịch hoặc bù trừ.
2. Cách hoạt động của Saga
Giả sử bạn có một hệ thống đặt hàng với các dịch vụ: Order, Payment, Inventory, và Shipping. Một Saga để xử lý đơn hàng có thể hoạt động như sau:
Trường hợp Choreography:
Dịch vụ Order tạo đơn hàng và phát sự kiện "OrderCreated".
Dịch vụ Payment nhận sự kiện, thực hiện thanh toán và phát sự kiện "PaymentProcessed".
Dịch vụ Inventory nhận sự kiện, kiểm tra kho, trừ hàng và phát sự kiện "InventoryUpdated".
Dịch vụ Shipping nhận sự kiện, sắp xếp vận chuyển và phát sự kiện "ShippingArranged".
Nếu bất kỳ bước nào thất bại (ví dụ: kho hết hàng), dịch vụ tương ứng sẽ phát sự kiện lỗi, kích hoạt các giao dịch bù (compensating transactions):
Shipping hủy vận chuyển.
Payment hoàn tiền.
Order hủy đơn hàng.
Trường hợp Orchestration:
Một Orchestrator (dịch vụ điều phối) ra lệnh cho Order tạo đơn hàng.
Sau khi nhận xác nhận, Orchestrator yêu cầu Payment xử lý thanh toán.
Tiếp tục với Inventory và Shipping.
Nếu có lỗi (ví dụ: thanh toán thất bại), Orchestrator sẽ ra lệnh thực hiện các giao dịch bù theo thứ tự ngược lại.
3. Ưu điểm của Saga Pattern
Tính linh hoạt: Cho phép thực hiện các giao dịch phân tán mà không cần khóa tài nguyên lâu dài.
Khả năng mở rộng: Phù hợp với kiến trúc microservices, nơi mỗi dịch vụ quản lý cơ sở dữ liệu riêng.
Khả năng phục hồi: Các giao dịch bù giúp hệ thống quay về trạng thái nhất quán khi xảy ra lỗi.
4. Nhược điểm của Saga Pattern
Phức tạp: Việc triển khai và quản lý các giao dịch bù đòi hỏi thiết kế cẩn thận.
Không đảm bảo tính atomicity hoàn toàn: Vì các giao dịch được thực hiện tuần tự, có thể xảy ra trạng thái trung gian không nhất quán tạm thời.
Khó debug: Theo dõi và xử lý lỗi trong một chuỗi giao dịch phân tán có thể phức tạp.
5. Khi nào nên sử dụng Saga Pattern?
Khi bạn xây dựng hệ thống microservices với các giao dịch phức tạp liên quan đến nhiều dịch vụ.
Khi cần đảm bảo tính nhất quán cuối cùng (eventual consistency) thay vì nhất quán tức thời.
Khi bạn muốn tránh sử dụng các giao dịch phân tán (distributed transactions) phức tạp như Two-Phase Commit (2PC).
6. Ví dụ thực tế
Hệ thống thương mại điện tử: Đặt hàng, thanh toán, trừ kho, và vận chuyển đều cần phối hợp.
Hệ thống đặt vé máy bay: Đặt vé, thanh toán, và xác nhận ghế ngồi.
Hệ thống tài chính: Chuyển tiền giữa các tài khoản ở các ngân hàng khác nhau.
7. Mẹo triển khai Saga Pattern
Sử dụng sự kiện: Các công cụ như Kafka, RabbitMQ giúp truyền tải sự kiện giữa các dịch vụ.
Thiết kế giao dịch bù rõ ràng: Mỗi bước phải có một giao dịch bù tương ứng để hoàn tác.
Theo dõi trạng thái: Trong Orchestration, lưu trữ trạng thái của Saga để xử lý lỗi hoặc khôi phục.
Xử lý lỗi: Đảm bảo hệ thống có cơ chế retry hoặc xử lý lỗi idempotent (thực hiện lại không gây ra trùng lặp).
8. Công cụ hỗ trợ
Axon Framework: Hỗ trợ triển khai Saga trong Java.
Eventuate Tram: Một framework cho Choreography Saga.
Temporal/Netflix Conductor: Hỗ trợ Orchestration Saga.
Last updated