Back to Explore
Cloudflare Workflows cập nhật tính năng Saga Rollbacks: Giải pháp quản lý giao dịch phức tạp hiệu quả

Cloudflare Workflows cập nhật tính năng Saga Rollbacks: Giải pháp quản lý giao dịch phức tạp hiệu quả

Cloudflare vừa giới thiệu tính năng Saga Rollbacks cho Workflows, cho phép nhà phát triển khai báo logic hoàn tác (rollback) trực tiếp ngay trong từng bước thực thi (step). Đây là giải pháp giải quyết bài toán tính nhất quán trong các quy trình xử lý đa bước dài hạn, giúp việc xử lý lỗi trở nên tường minh, an toàn và dễ bảo trì hơn mà không cần đến các khối try-catch phức tạp.

Website
Upvote this postSign in to upvote this article.

Saga Rollbacks cho Cloudflare Workflows

Giới thiệu về Cloudflare Workflows

Cloudflare Workflows cho phép các lập trình viên xây dựng những ứng dụng bền bỉ (durable), xử lý đa bước với các cơ chế tự động thử lại (retries) và duy trì trạng thái xuyên suốt các tiến trình chạy dài (long-running processes). Tuy nhiên, một thách thức lớn trong các hệ thống phân tán là: khi một bước trong quy trình thất bại, nó có thể để lại các bước trước đó ở trạng thái không nhất quán.

Bài toán Saga Pattern trong giao dịch

Xét ví dụ kinh điển về việc chuyển tiền giữa hai ngân hàng:

  1. Trừ tiền ở Tài khoản A.
  2. Cộng tiền ở Tài khoản B.
  3. Gửi email xác nhận cho cả hai chủ tài khoản.

Nếu bước 2 thất bại, tiền đã bị trừ ở tài khoản A nhưng chưa tới tài khoản B. Bạn không thể đơn thuần "hủy bỏ" giao dịch ngân hàng đã xác nhận, mà phải thực hiện một thao tác bù trừ (compensation logic) để hoàn lại số tiền. Đây chính là Saga Pattern.

Cách tiếp cận mới với Saga Rollbacks

Trước đây, nhà phát triển phải tự quản lý logic bù trừ thủ công bên ngoài định nghĩa của từng bước. Giờ đây, Cloudflare đã tích hợp khả năng khai báo logic rollback ngay trong tham số step.do().

Ví dụ mã nguồn (Trước khi có Rollbacks):

let debitA;
let creditB;
try {
  debitA = await step.do("debit-bank-a", () => bankA.debit(from, amount));
  creditB = await step.do("credit-bank-b", () => bankB.credit(to, amount));
  await step.do("notify", () => notifyBoth(from, to, amount));
} catch (error) {
  if (creditB) {
    await step.do("reverse-credit-b", () => bankB.debit(to, amount, creditB.id));
  }
  if (debitA) {
    await step.do("refund-debit-a", () => bankA.credit(from, amount, debitA.id));
  }
  throw error;
}

Ví dụ mã nguồn (Sau khi có Rollbacks):

await step.do("debit-bank-a", () => bankA.debit(from, amount), {
  rollback: async ({ output }) => bankA.credit(from, amount, output.id),
});
await step.do("credit-bank-b", () => bankB.credit(to, amount), {
  rollback: async ({ output }) => bankB.debit(to, amount, output.id),
});

Các quy tắc thực thi quan trọng

Cloudflare đã tối ưu hóa cơ chế này dựa trên 3 nguyên tắc:

  1. Step thất bại vẫn có thể rollback: Nếu một bước bị lỗi nhưng đã đăng ký handler, hệ thống vẫn sẽ thực thi rollback. Handler cần xử lý trường hợp output có thể là undefined.
  2. Rollback chỉ chạy khi toàn bộ Workflow thất bại: Nếu lỗi được bắt (catch) bên trong code người dùng, Workflow sẽ tiếp tục. Rollback chỉ kích hoạt khi Workflow không thể tự phục hồi.
  3. Thứ tự thực thi: Hệ thống chạy theo thứ tự ngược của thời gian bắt đầu bước (reverse step-start order) để đảm bảo tính an toàn cho các tác vụ song song.

Tại sao không dùng Fluent API hay Builder API?

Đội ngũ phát triển tại Cloudflare đã cân nhắc nhiều phương án trước khi chọn cách tiếp cận hiện tại:

  • Fluent API (.rollback()): Dễ đọc nhưng gây hiểu nhầm về cơ chế Promise pipelining của Workers, vì rollback không phải là kết quả trả về của bước đó.
  • Builder API (.saga().do().run()): Quá nhiều "nghi lễ" (boilerplate), dễ gây lỗi quên gọi .run() và làm thay đổi cấu trúc primitive step.do() đã quen thuộc.

Kết quả: Giải pháp truyền trực tiếp options vào step.do() là phương án tối ưu nhất, giúp duy trì sự tường minh giữa hành động chính và logic bù trừ.

Cấu hình nâng cao

Ngoài logic cơ bản, bạn có thể cấu hình chi tiết cho rollback như retries và timeout thông qua rollbackConfig:

rollbackConfig: {
  retries: { limit: 10, delay: '30 seconds', backoff: 'exponential' },
  timeout: '2 minutes',
},

Tính năng này đánh dấu một bước tiến lớn giúp Cloudflare Workflows trở thành công cụ đắc lực cho các kiến trúc hướng sự kiện (event-driven) và các hệ thống tài chính yêu cầu độ tin cậy cao.

Discussion (0)

You need to log in to post comments. Log In

No comments yet. Start the discussion!

Do you like this post?

Upvote to push this post higher on the community feed

Details

Posted by: @admin
Categories: Developer Tools
Date posted: 8 tháng 7, 2026