Tìm ra bài viết này chắc hẳn anh em đã biết về microservices, concept của micro services chia các service nhỏ để scale và quản lý, nhưng nó lại phát sinh vấn đề về sự nhất quán của dữ liệu giữa các micro services, đó là lý do tui viết bài về SAGA Pattern cho anh em.
Vậy SAGA pattern là gì? Bằng các nào nó có thể quản lý và đảm bảo được sự nhất quán dữ liệu giữa các micro services?
Tất cả sẽ được trình bày rõ trong bài viết này.
Bắt đầu thôi anh em. Luôn là định nghĩa.
1. Saga Pattern là gì?
The Saga design pattern is a way to manage data consistency across microservices in distributed transaction scenarios. A saga is a sequence of transactions that updates each service and publishes a message or event to trigger the next transaction step. If a step fails, the saga executes compensating transactions that counteract the preceding transactions.
Saga design pattern là cách quản lý sự thống nhất của dữ liệu giữa các microservices trong các kịch bản việc giao dịch là phân tán (distributed). SAGA là một chuỗi các giao dịch cập nhật giữa các service và publish thông báo hoặc trigger các bước transaction. Nếu một bước thất bại, SAGA sẽ thực hiện giao dịch tương tự để khoả lấp cho các transactions trước đó
Ôi lạy chúa cái định nghĩa đọc thôi đã thấy khó hiểu. Để tóm tắt lại cho anh em, đơn giản thì có 2 ý:
- SAGA Pattern là pattern đảm bảo tính nhất quán của dữ liệu (bằng các quản lý transactions) giữa các microservices khác nhau.
- Vì là hệ thống phân tán nên mỗi ông có thể xử lý một phần (nằm trên một transactions), nếu một cái bị fail thì SAGA lúc này có thể thực hiện một transactions thay thế bù vào cái transactions bị fail đó.
2. Giải pháp
Về mặt ý tưởng, mỗi micro services khi nhận được yêu cầu thực hiện transactions, bản thân micro services đó sẽ thực hiện transactions tại chính services đó. Sau khi đã thực hiện xong, theo hướng của SAGA Pattern, services đó sẽ publish một thông báo (message) hoặc một events (sự kiện).
Từ thông báo hoặc sự kiện đó sẽ biết được transactions nào nên được thực hiện tiếp.
Như hình phía trên, Order Services sau khi thực hiện transactions tại service sẽ publish message hoặc event để biết kế tiếp sẽ phải thực hiện transactions tại Customer Service.
Customer Services sau đó publish tiếp để biết cần phải quay lại Order Service để thực hiện tiếp transactions.
Tuyển dụng lập trình viên Frontend lương cao tại đây!
3. Hai cách quản lý
Theo như concept này, có 2 cách để SAGA có thể quản lý được transactions:
- Thứ nhất là Choreography (Vũ đạo), ở đây anh em hiểu là vũ công cũng được, vì người nào múa người đó. Cái này như ví dụ phía trên, mỗi transactions tự quản lý transactions nào sẽ cần được thực hiện kế tiếp, ông nào lo ông đó.
- Thứ hai là Orchestration (Ban nhạc), ban nhạc thì anh em biết rồi, có ông nhạc trưởng ban nhạc mới chơi nhạc được. Cách số hai này hướng tới một ông có thể điều phối, tức là hết transactions ở ông Order Service sẽ qua Customer Services, cái này ông điều phối lo.
Ngoài ra cách hiểu theo ví dụ thực tế như thế này sẽ nhớ rất lâu. Rất khó quên, anh em nên luyện tập nhớ theo kiểu này nha.
Rồi đi vào từng cái với hình ảnh minh hoạ cho dễ hiểu hơn.
4. Choreography-based saga
Như đã giải thích sơ với anh em ở phía trên, Choreography trong SAGA Pattern theo concept ông nào lo ông đấy.
SAGA Pattern mà cụ thể là Choreography thường được áp dụng cho các sàn giao dịch thương mại điện tử. Như ví dụ trên đây:
- 1. Đầu tiên khi anh em đặt hàng, ông Order Service nhận được một POST request /orders. Lúc này đơn hàng ở trạng thái PENDING.
- 2. Sau khi đơn hàng đã xong, services này đẩy ra một event là order created.
- 3. Customer Service nhận được event (hoặc nó trigger events) này, xử lý thanh toán liên quan tới thẻ tín dụng của khách
- 4. Sau khi đã xong nó sẽ publish lại một event hoặc message cho ông Order biết để approver hoặc reject đơn hàng của khách.
Đơn giản, dễ hiểu. Services nào tự lo, tự xử lý cái event của riêng mình, cần ông nào thì publish ra cho ông đó xài.
4.1 Ưu nhược điểm
Về ưu nhược điểm của Choreography chắc anh em nào code nhiều sẽ đoán ra được. Đầu tiên là ưu điểm:
- Mẫu này đơn giản, dễ hiểu nên có thể apply nhanh chóng cho các business nhỏ
- Do services nào handle event, message của services đó nên có thể implement nhanh chóng
Về nhược điểm thì lúc có nhiều hơn events sẽ khiến logic trở nên phức tạp và khó kiểm soát.
5. Orchestration-based saga
Orchestration trong SAGA Pattern thì ngược với Choreography. Chỗ này các micro services không tự handle event mà tập trung lại ở ông Message Broker. Ông này đóng vai trò như người điều phối trong dàn nhạc.
Event nào tới, event nào đi đều phải thông qua ổng, ông điều tới điều lui
Giải thích cho hình vẽ phía trên:
- 1. Anh em cũng nhận được order từ POST request, trạng thái order lúc này vẫn là PENDING.
- 2. Microservices vẫn đẩy event ra là nhận được order, nhưng nó không cần biết services nào sẽ xử lý tiếp theo, chỉ việc đẩy lên message brokers
- 3. Ông message broker lúc này gửi tới Customer Services là xử lý credit đi.
- 4. Ông Customer services xử lý
- 5. Đẩy lại lên message broker về đơn hàng thanh toán thành công hay thất bại
- 6. Message broker đẩy lại cho Order service xử tiếp
5.1 Ưu nhược điểm
Về ưu điểm thì Orchestration thích hợp cho các mô hình kinh doanh phức tạp. Cần phải quản lý và xử lý liên quan nhiều giữa các micro services. Trường hợp có thêm services hoặc thêm event, message cũng không quá phức tạp
Về nhược điểm thì có 2 nhược điểm rõ ràng là:
- Tốn effort để manage và xử lý với message broker. Cái kia chỉ viết logic publish message hoặc event ngay trong services.
- Signle point of failure -> Ông message broker mà ngủm thì toàn bộ ngủm theo. Cái này không đúng với concept của microservice. Một cái ngủm các cái khác vẫn hoạt động.
6. Tham khảo
Chỉ một bài viết này e là chưa đủ với SAGA Pattern, hẹn anh em ở phần hai, đi sâu hơn và ví dụ sử dụng cho từng loại.
Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!
Tác giả: Kiên Nguyễn
Xem thêm: