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).
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.
3. Saga vs 2PC — và chọn cách triển khai
| Tiêu chí | 2PC (Two-Phase Commit) | Saga |
|---|---|---|
| Consistency | Mạnh (ACID, atomic ngay) | Eventual (có trạng thái trung gian) |
| Khóa tài nguyên | Giữ lock xuyên service suốt phase | Không — commit & nhả ngay |
| Blocking | Có (in-doubt khi coordinator chết) | Không |
| Scale | Kém (lock + coordinator nghẽn) | Tốt (service độc lập) |
| SPOF | Coordinator | Orchestrator (nếu dùng) → cần HA |
| Isolation | Có (lock đảm bảo) | Không — cần countermeasure (semantic lock) |
| Khi nào dùng | Phạm vi hẹp, latency thấp, cần atomic tuyệt đối | Microservice, latency cao, cần scale |
Choreography hay Orchestration? Chọn một kịch bản: