Xử lý lỗi và thử lại là quan trọng cho các consumer RabbitMQ đáng tin cậy — quyết định làm gì khi xử lý message thất bại (thử lại, dead-letter, hoặc bỏ đi). Xử lý lỗi đúng cách ngăn mất message và consumer bị kẹt.
Vấn đề
Khi một consumer thất bại khi xử lý một message (dữ liệu xấu, lỗi downstream, bug):
→ requeue mãi mãi → một message "độc" chặn queue (thử lại liên tục)
→ bỏ đi → message MẤT
→ crash → xử lý lại, có thể lại bị kẹt
→ cần một chiến lược có chủ đích.
Các chiến lược thử lại
✓ NACK + REQUEUE → reject và requeue để thử lại (nhưng giới hạn số lần thử — đừng requeue mãi mãi)
✓ THỬ LẠI VỚI BACKOFF → thử lại các lỗi tạm thời với độ trễ tăng dần (vd: qua một delayed
retry queue với TTL → requeue sau một độ trễ)
✓ GIỚI HẠN THỬ LẠI → theo dõi số lần thử; sau N lần thất bại → DEAD LETTER (đừng thử lại mãi mãi)
✓ Phân biệt lỗi TẠM THỜI (thử lại) vs VĨNH VIỄN (dead-letter ngay lập tức)
