Sắp xếp: thanh toán bị từ chối giữa chừng một saga Trung cấp
Thời gian đọc ước tính: 1 phút
Khi thanh toán thất bại, ghế và phòng khách sạn đã commit trong service riêng. Không có ROLLBACK xuyên service: orchestrator phải hoàn tác bằng các bước bù trừ, và thứ tự là quan trọng.
Sắp xếp các bước khôi phục dưới đây, từ lúc nhận PaymentDeclined tới tin nhắn khách nhận được. Bấm Kiểm tra để biết bước nào sai chỗ và sai thì hỏng gì.
Thanh toán bị từ chối giữa saga: khôi phục đơn đặt tour theo đúng thứ tự
Saga saga-123 đặt gói tour qua một orchestrator. T1 ReserveSeat đã giữ ghế 12A, T2 ReserveHotelRoom đã giữ phòng 204, cả hai đã commit trong service riêng. T3 ChargePayment vừa trả về PaymentDeclined. T4 IssueTicket chưa chạy.
Orchestrator lưu trạng thái trong saga_instance và gửi command qua outbox; broker giao ít nhất một lần. Sắp xếp các bước khôi phục.
Dùng ▲▼ để đổi chỗ từng bước, hoặc chạm ⠿ của một bước rồi chạm vào vị trí mới. Trên máy tính có thể kéo thả.
- Chặn các bước tiến: guard chỉ gửi
IssueTicketkhi state làRUNNING, nên không command tiến nào của saga-123 được gửi đi - Commit
state = COMPENSATEDcùng eventBookingFailedtrong outbox - Gửi
CancelHotelRoomvới keysaga-123:hotel:cancel, ghi vào outbox cùng lần đổi bước - Gửi
ReleaseSeatvới keysaga-123:seat:release, retry y như vậy tới khi nhậnSeatReleased - Báo khách từ event
BookingFailed: thanh toán bị từ chối, không trừ tiền, ghế và phòng đã được nhả - Retry
CancelHotelRoomvới cùng key tới khi nhậnHotelCancelled("không có lần giữ nào" cũng tính là xong) - Commit
state = COMPENSATING,failed_step = charge_paymentvàosaga_instance
Các loại bước, trạng thái saga và biện pháp bù cho việc thiếu isolation: Saga pattern.