Cloudflare Workflows hỗ trợ Saga Rollbacks — Không còn logic bù đắp thủ công
Cloudflare tung ra saga rollbacks cho Workflows, cho phép bạn định nghĩa logic bù đắp ngay trong mỗi lệnh gọi step.do(). Không còn các khối catch thủ công và mã hoàn tác theo thứ tự ngược.

Cloudflare Workflows giờ đây hỗ trợ mẫu saga một cách tự nhiên. Thay vì bọc mỗi bước trong try-catch và tự theo dõi những gì cần hoàn tác, bạn có thể truyền một hàm rollback như một tùy chọn cho step.do(). Nếu một bước sau đó thất bại, Workflows sẽ chạy các trình xử lý rollback theo thứ tự bắt đầu bước ngược lại — chính xác những gì bạn cần cho các giao dịch phân tán.
Tại sao Saga Rollbacks lại quan trọng
Các workflow chạy dài thường chạm vào nhiều hệ thống bên ngoài. Một chuyển khoản có thể ghi nợ tài khoản A, ghi có tài khoản B, sau đó gửi thông báo. Nếu việc ghi có thất bại, bạn không thể chỉ hoàn tác việc ghi nợ — bạn cần một hành động bù đắp (một khoản ghi có ngược lại). Đó là mẫu saga. Trước bản phát hành này, các nhà phát triển phải tự triển khai việc bù đắp đó, theo dõi bước nào thành công và viết logic ngược lại trong một khối catch. Nó dễ sai sót và dài dòng.
Giờ đây bạn viết:
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),
});
await step.do("notify", () => notifyBoth(from, to, amount));Trình xử lý rollback nằm ngay cạnh thao tác thuận. Không cần khối catch riêng, không cần sắp xếp thủ công. Workflows xử lý phần còn lại.
Các quyết định thiết kế chính
Nhóm đã cân nhắc một API fluent (step.do(...).rollback(...)) nhưng đã từ chối. Vấn đề: step.do() trả về một promise, và Workers hỗ trợ promise pipelining (một tính năng Cap'n Proto cho phép bạn gọi các phương thức trên một giá trị tương lai trước khi nó được giải quyết). Một API fluent sẽ gây mơ hồ liệu .rollback() là một phần của định nghĩa bước hay một phương thức trên đầu ra. Nó cũng sẽ làm chậm việc thực thi bước — Workflows sẽ cần chờ xem liệu .rollback() có được gắn vào trước khi bắt đầu bước hay không. API dựa trên tùy chọn hiện tại giữ cho việc thực thi bước tức thì và có thể dự đoán được.
Rollback chỉ kích hoạt khi workflow sắp thất bại hoàn toàn. Nếu bạn bắt lỗi và tiếp tục, rollback không chạy. Bước thất bại tự nó có thể đủ điều kiện để rollback nếu nó đã đăng ký một trình xử lý — điều này quan trọng vì một bước có thể đã tương tác một phần với hệ thống bên ngoài trước khi thất bại. Trình xử lý rollback nhận output (có thể là undefined) để bạn có thể quyết định những gì cần hoàn tác.
Đối với các bước song song, thứ tự rollback sử dụng thứ tự bắt đầu bước ngược lại, không phải thứ tự hoàn thành. Điều này tránh sự mơ hồ khi các bước hoàn thành theo thứ tự khác với thứ tự chúng bắt đầu.
Kết luận
Đây là một API vững chắc, thực dụng cho một mẫu hệ thống phân tán phổ biến. Nếu bạn đang xây dựng các workflow nhiều bước trên Cloudflare Workers, saga vừa trở nên bớt đau đớn hơn nhiều. Mẫu khóa idempotency được hiển thị trong tài liệu là điều bắt buộc phải tuân theo — làm cho cả thao tác thuận và rollback trở nên idempotent để tránh áp dụng hai lần khi thử lại.
Thảo luận
0 bình luận
Hãy là người đầu tiên thảo luận.