Outbox pattern giúp workflow ghi thay đổi nghiệp vụ và sự kiện cần phát trong cùng một transaction cục bộ, sau đó worker gửi sự kiện với retry và audit rõ ràng.

Outbox pattern là gì?

Outbox pattern là kỹ thuật ghi thay đổi dữ liệu và thông điệp vào cùng một transaction cục bộ. Worker phía sau đọc bản ghi outbox, phát sự kiện và cập nhật trạng thái xử lý.

Vì sao gửi sự kiện trực tiếp dễ mất dữ liệu?

Nếu commit database trước rồi gọi broker, process có thể dừng giữa hai thao tác. Nếu gửi broker trước rồi rollback, hệ thống nhận sự kiện không phản ánh trạng thái thật. Outbox tạo ra nguồn sự thật bền vững để xử lý lại.

Bản ghi outbox nên có những trường nào?

Nên có event_id duy nhất, aggregate_id, event_type, payload version, trạng thái pending hoặc published, số lần thử, next_attempt_at, thời điểm tạo, thời điểm phát và lỗi cuối cùng. Không lưu dữ liệu nhạy cảm nếu consumer không cần.

Quy trình xử lý outbox từng bước

Transaction nghiệp vụ ghi dữ liệu chính và bản ghi outbox. Worker claim một lô bản ghi đến hạn, phát sự kiện kèm idempotency key, đánh dấu published khi thành công hoặc đặt lịch retry khi lỗi tạm thời.

Outbox có bảo đảm gửi đúng một lần không?

Không nên hứa exactly-once xuyên nhiều hệ thống. Worker có thể gửi thành công rồi dừng trước khi đánh dấu published, vì vậy consumer phải xử lý lặp an toàn bằng event_id hoặc bảng deduplication.

Retry, lease và dead-letter queue phối hợp ra sao?

Retry chỉ dành cho lỗi tạm thời và nên dùng exponential backoff cùng jitter. Lease giúp worker khác nhận lại bản ghi bị kẹt. Lỗi vượt retry budget chuyển sang dead-letter queue để điều tra.

Checklist triển khai production

Transaction và outbox dùng cùng database transaction; event_id duy nhất; consumer idempotent; worker có lease, timeout và retry budget; có DLQ, metric bản ghi pending, chính sách dọn dữ liệu và kiểm thử process dừng ở mọi điểm.

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

Outbox có thay broker không? Không, outbox lưu bền vững còn broker phân phối. Có dùng cho webhook không? Có, hãy lưu request, response và số lần thử.

Kết luận

Transactional outbox biến khoảng trống giữa commit dữ liệu và phát sự kiện thành một hàng đợi có trạng thái, retry và audit. Kết hợp idempotency, lease, backoff và DLQ giúp workflow phục hồi lỗi an toàn.