Lesson 66 — Saga Pattern

Giao dịch phân tán không có BEGIN/COMMIT chung. Saga = chuỗi local transaction commit-ngay, mỗi bước có compensation để bù khi fail. Ba module dưới đây cho bạn "chạy" thử: (1) orchestration saga — tiến rồi inject lỗi để xem bù ngược; (2) choreography — chuỗi event + compensation event; (3) so sánh Saga vs 2PC + chọn choreography/orchestration.

1. Orchestration saga — tiến & bù ngược

Orchestrator chủ động gọi từng bước. Bấm Chạy từng bước để tiến, hoặc bật "Ép lỗi" ở một bước rồi chạy — khi tới bước đó saga sẽ compensate ngược (refund, cancel). Cột state bên dưới là cái orchestrator persist xuống DB sau mỗi hành động (để recover sau crash).

🎛️ Saga Orchestrator (state machine)
running done failed compensated

2. Choreography saga — chuỗi event

Không có orchestrator. Mỗi service nghe event → react → emit event tiếp. Compensation cũng chảy bằng event đảo. Chọn kịch bản rồi bấm Phát từng event để xem event lan trên bus. Mỗi event mang sagaId để service biết bù cho saga nào.

Kịch bản: Inventory hết hàng
Order
Payment
Inventory
event tiến event fail compensation event

3. Saga vs 2PC — và chọn cách triển khai

Tiêu chí2PC (Two-Phase Commit)Saga
ConsistencyMạnh (ACID, atomic ngay)Eventual (có trạng thái trung gian)
Khóa tài nguyênGiữ lock xuyên service suốt phaseKhông — commit & nhả ngay
BlockingCó (in-doubt khi coordinator chết)Không
ScaleKém (lock + coordinator nghẽn)Tốt (service độc lập)
SPOFCoordinatorOrchestrator (nếu dùng) → cần HA
IsolationCó (lock đảm bảo)Không — cần countermeasure (semantic lock)
Khi nào dùngPhạm vi hẹp, latency thấp, cần atomic tuyệt đốiMicroservice, latency cao, cần scale

Choreography hay Orchestration? Chọn một kịch bản:

Saga ngắn 3 bước, tuyến tính
user đăng ký → tạo profile → gửi email chào mừng. Coupling lỏng, ít rẽ nhánh.
Quy trình duyệt vay 8 bước
Nhiều bước, rẽ nhánh điều kiện (số tiền lớn → fraud check), cần audit toàn flow.
"Saga 42 đang ở bước nào?"
Team không trả lời nhanh được câu này; flow event phình to, khó debug.