Idempotency là khả năng xử lý cùng một sự kiện nhiều lần nhưng hệ thống vẫn tạo ra cùng một kết quả mong muốn. Để chống chạy trùng, workflow cần khóa idempotency ổn định, nơi lưu trạng thái đã xử lý và quy tắc rõ ràng cho retry, timeout và xử lý thủ công.

Idempotency trong workflow nghĩa là gì?

Idempotency là khả năng xử lý cùng một sự kiện nhiều lần nhưng hệ thống vẫn tạo ra cùng một kết quả mong muốn, thay vì gửi trùng, tạo trùng hoặc cập nhật lặp. Mục tiêu là bảo đảm tác động ra bên ngoài không bị lặp ngoài chủ ý.

Vì sao workflow dễ chạy trùng?

Webhook có thể được gửi lại, người dùng có thể gửi lại biểu mẫu, hệ thống có thể retry sau timeout hoặc hai worker có thể nhận cùng sự kiện gần như đồng thời. Khó nhất là trạng thái đã thực hiện nhưng chưa ghi nhận; retry mù lúc này có thể tạo tác động kép.

Khóa idempotency nên được thiết kế thế nào?

Khóa cần ổn định, duy nhất theo nghiệp vụ và có thể truy tìm khi điều tra lỗi. Có thể kết hợp mã nguồn, loại sự kiện và mã đối tượng, ví dụ crm:order_created:ORD-1042. Không nên dùng thời điểm hiện tại hoặc số ngẫu nhiên mới tạo ở mỗi lần retry.

Mẫu kiểm tra – ghi nhận – thực hiện

Một workflow chống chạy trùng thường có ba pha: kiểm tra khóa trong kho trạng thái; ghi nhận bản ghi đang xử lý theo khóa; thực hiện hành động bên ngoài rồi lưu kết quả. Bước ghi nhận phải chống tranh chấp để hai worker không cùng chiếm một khóa.

Retry, timeout và trạng thái không chắc chắn

Mỗi hành động cần quy định điều kiện retry, số lần retry, khoảng chờ và cách truy vấn lại kết quả theo khóa. Nếu timeout xảy ra sau khi hệ thống đích đã thành công nhưng chưa ghi log, hãy đánh dấu không chắc chắn và yêu cầu kiểm tra thay vì retry mù.

Idempotency khác gì deduplication?

Deduplication phát hiện và loại bỏ bản ghi trùng; idempotency bảo vệ cả quá trình xử lý để cùng một ý định không gây thêm tác động. Có thể dùng deduplication ở đầu vào nhưng vẫn cần idempotency ở bước gửi email, tạo giao dịch hoặc cập nhật dữ liệu.

Kiểm thử chống chạy trùng

Hãy gửi cùng sự kiện hai lần, retry sau timeout, chạy đồng thời hai worker, retry sau khi hành động đích đã thành công, kiểm tra hai phiên bản nghiệp vụ và khóa bị thiếu hoặc sai. Kiểm tra cả số lần tác động bên ngoài, trạng thái khóa và thông báo. Có thể kết hợp với validation và xử lý ngoại lệ trong workflow.

Checklist triển khai

Xác định hành động không được lặp; chọn khóa ổn định; truyền nguyên khóa qua retry; có trạng thái đang xử lý, thành công, thất bại và không chắc chắn; chống tranh chấp; quy định timeout; lưu log đủ truy vết; kiểm thử sự kiện lặp và chạy đồng thời.

Câu hỏi thường gặp

Workflow chỉ đọc dữ liệu có thể ít cần idempotency hơn, nhưng mọi workflow gửi, tạo, cấp quyền hoặc cập nhật dữ liệu đều nên có cơ chế phù hợp. Khóa thời gian không an toàn nếu mỗi retry tạo thời điểm mới. Khi không biết lần trước thành công hay chưa, cần truy vấn theo khóa hoặc chuyển người kiểm tra.

Kết luận

Idempotency giúp workflow an toàn trước webhook lặp, retry và xử lý đồng thời. Khi khóa ổn định, trạng thái rõ ràng và tình huống không chắc chắn được chuyển đúng người, doanh nghiệp có thể mở rộng tự động hóa mà không tạo bản ghi, thông báo hoặc giao dịch bị nhân đôi.