2. 18:15 12/08/2026
Đáp án được người đặt câu hỏi chọn
Chào bạn Minh Khôi,
Đây là bài toán nhất quán giữa database transaction và side effect bên ngoài. Không nên giữ transaction MySQL mở khi gọi HTTP/email vì thời gian chờ làm tăng lock, không đảm bảo bên ngoài rollback được và dễ tạo deadlock/timeout.
Outbox pattern là một hướng thực dụng:
1. Trong cùng transaction tạo order, ghi một outbox event có event ID, loại sự kiện, payload tối thiểu, thời gian và trạng thái chưa xử lý.
2. Sau commit, worker đọc outbox theo batch có lock/claim phù hợp, gửi email/webhook và đánh dấu hoàn thành. Worker phải chịu được crash giữa các bước.
3. Consumer hoặc provider cần idempotency event ID; việc giao lại có thể xảy ra, vì vậy hướng tới at-least-once delivery nhưng xử lý một lần về mặt nghiệp vụ.
4. Có retry với backoff, giới hạn số lần, dead-letter/quarantine và alert; không retry vô hạn lỗi do payload hoặc cấu hình sai.
5. Lưu correlation ID, tránh nhét dữ liệu nhạy cảm không cần thiết vào payload/outbox, đồng thời có retention/cleanup rõ.
Hãy test những điểm fail thực tế: DB commit rồi worker chết, provider timeout sau khi đã nhận request, event bị gửi hai lần và deploy giữa lúc còn event chờ. Đó là nơi thiết kế đáng tin cậy được chứng minh.
0