← Về trang chủ

Đừng Để AI Agent Làm Mất Đơn: Thiết Kế Dead Letter Queue Trong n8n

"Tỵ ơi, khách nhắn chốt 3 hộp serum, bot trả lời rất tự tin là đã tạo đơn. Nhưng mở Google Sheets ra thì không có dòng nào. Vậy đơn đó mất luôn hả anh?"

Đây là lỗi mình gặp khá nhiều sau khi anh em nâng cấp chatbot thành AI Agent biết gọi tool. Bài trước mình nói về Tool-Calling: AI không chỉ trả lời, mà còn biết tạo đơn, ghi Sheets, gửi thông báo. Nhưng có một lớp rất dễ bị bỏ quên: nếu tool lỗi giữa chừng thì dữ liệu đi về đâu?

Với một shop mỹ phẩm đang chạy auto-reply bằng n8n, trong 30 ngày có 11 đơn bị rơi vào trạng thái lưng chừng: khách tưởng đã đặt xong, bot tưởng đã gọi tool xong, nhưng Sheets không có đơn. Nguyên nhân không phải AI kém, mà là workflow thiếu một hàng đợi lỗi để giữ lại những việc chưa xử lý được.

Mình thường gọi lớp này là Dead Letter Queue: nơi nhốt tạm các yêu cầu lỗi để kiểm tra, retry hoặc chuyển cho người thật xử lý.

3 kỹ thuật mình dùng trong n8n:

  1. Bắt lỗi bằng Error Trigger riêng cho workflow tạo đơn: Đừng chỉ nhìn node đỏ rồi hy vọng có người phát hiện. Mình tạo một workflow Error Trigger, nối với các workflow quan trọng như tạo đơn, ghi CRM, gửi email, cập nhật Sheets.

Khi lỗi xảy ra, Error Trigger ghi lại 5 thứ: mã sự kiện, dữ liệu khách gửi ban đầu, node bị lỗi, thông báo lỗi, thời điểm lỗi. Nếu không lưu input gốc, sau này muốn chạy lại cũng không biết phải chạy lại bằng dữ liệu nào.

  1. Tạo Dead Letter Queue bằng Google Sheets: Mình dùng một sheet riêng tên DLQ Orders. Mỗi dòng là một việc bị lỗi, gồm: event_id, customer_id, payload, failed_node, error_message, retry_count, status.

Quan trọng nhất là event_id. Nếu cùng một event_id đã tồn tại thì không tạo dòng mới. Nhờ vậy, khi Facebook webhook gửi lại hoặc mình bấm chạy lại thủ công, workflow không tạo thêm 2 đơn trùng cho cùng một khách.

  1. Retry có điều kiện, không retry mù: Không phải lỗi nào cũng nên chạy lại ngay. Mình đặt node IF sau khi ghi DLQ: • Nếu lỗi timeout, API 5xx, mạng chập chờn → cho retry tối đa 3 lần bằng Wait node. • Nếu thiếu số điện thoại, sai định dạng địa chỉ → chuyển trạng thái cần người kiểm tra. • Nếu lỗi quyền truy cập hoặc token hết hạn → gửi cảnh báo admin, dừng retry.

Cách này tránh được kiểu workflow tự chạy lại 20 lần, vừa tốn tiền API vừa làm loạn dữ liệu.

Sơ đồ n8n hoàn chỉnh mình đang chạy có thứ tự như sau: • Webhook nhận tin nhắn khách • AI Agent phân tích ý định và gọi tool tạo đơn • Tool ghi Google Sheets hoặc CRM • Nếu thành công: trả mã đơn cho khách • Nếu lỗi: Error Trigger bắt lỗi • Ghi payload vào Dead Letter Queue • IF phân loại lỗi: retry tự động, cần người duyệt, hoặc dừng khẩn cấp • Telegram báo cho người phụ trách kèm nút kiểm tra • Khi xử lý xong, cập nhật status thành recovered hoặc permanent_failed

Kết quả thực tế sau 14 ngày áp dụng cho shop mỹ phẩm đó: • Đơn bị mất dấu: 11 đơn/tháng → 0 đơn bị mất không dấu vết • Thời gian phát hiện lỗi tạo đơn: 2 đến 6 giờ → dưới 1 phút • Lỗi timeout được xử lý lại thành công: 87% sau tối đa 3 lần retry

Bài học rút ra: AI Agent không nguy hiểm vì nó gọi tool, mà nguy hiểm khi nó gọi tool lỗi nhưng workflow không để lại dấu vết.

Chi tiết cấu trúc bảng Dead Letter Queue, cách phân loại lỗi và mẫu flow retry trong n8n mình để tại link Blog dưới bình luận nhé!

Anh em đang xử lý lỗi workflow kiểu nào: để node đỏ rồi vào xem thủ công, hay đã có hàng đợi lỗi riêng để cứu dữ liệu?

Bình luận

Chi tiết cấu trúc bảng Dead Letter Queue, cách phân loại lỗi và mẫu flow retry trong n8n mình chia sẻ tại Blog: https://tyauto.name.vn/posts/2026-09-15-personal-feed-dead-letter-queue.html

🔀
Giảm chi phí token khi gọi API AI

Hostinger VPS — 9router proxy

Proxy định tuyến API AI: giảm chi phí token và tự phân phối yêu cầu qua hơn 40 nhà cung cấp LLM. Triển khai một cú nhấp, sao lưu tự động hằng tuần. giảm tới 69%

🚀 Xem ưu đãi Hostinger
🚀
VPS chạy n8n

Hostinger VPS — n8n tự lưu trữ

Chạy n8n tự lưu trữ: workflow không giới hạn, số lệnh chạy đồng thời không giới hạn, dùng được node cộng đồng. Hoàn tiền trong 30 ngày. giảm tới 69%

🚀 Xem ưu đãi Hostinger
✅ Đã sao chép đoạn code JS vào clipboard!