Bỏ qua để đến nội dung
Knowledge Hub

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ì.

Sắp xếp

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ả.

  1. Chặn các bước tiến: guard chỉ gửi IssueTicket khi state là RUNNING, nên không command tiến nào của saga-123 được gửi đi
  2. Commit state = COMPENSATED cùng event BookingFailed trong outbox
  3. Gửi CancelHotelRoom với key saga-123:hotel:cancel, ghi vào outbox cùng lần đổi bước
  4. Gửi ReleaseSeat với key saga-123:seat:release, retry y như vậy tới khi nhận SeatReleased
  5. 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ả
  6. Retry CancelHotelRoom với cùng key tới khi nhận HotelCancelled ("không có lần giữ nào" cũng tính là xong)
  7. Commit state = COMPENSATING, failed_step = charge_payment vào saga_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.