Có ba cách, chọn theo độ phức tạp bạn chấp nhận.
1. TTL + dead-letter exchange (không cần plugin). Đẩy message vào một queue "chờ" không có consumer, đặt x-message-ttl = 30 phút và trỏ x-dead-letter-exchange sang exchange xử lý thật. Hết TTL, message tự dead-letter sang queue làm việc.
{ "x-message-ttl": 1800000, "x-dead-letter-exchange": "reminder.work" }Hạn chế: TTL đặt trên queue nên mọi message trong queue đó phải cùng độ trễ. Đặt TTL theo từng message thì bị head-of-line blocking — message ở đầu queue hết hạn muộn sẽ chặn message phía sau dù đã tới hạn. Muốn nhiều mốc trễ thì tạo nhiều queue chờ (5 phút, 30 phút, 1 giờ).
2. Delayed message exchange plugin. Publish kèm header x-delay tính bằng ms, broker giữ message đến đúng giờ. Tiện nhưng là plugin cộng đồng, cần cân nhắc khi vận hành cụm lớn.
3. Bảng lịch trong DB + job quét. Lưu send_at vào bảng, một cron mỗi phút quét các bản ghi đến hạn rồi publish. Kém "thời gian thực" nhất nhưng dễ quan sát, dễ huỷ lịch, dễ đổi thời điểm — thường là lựa chọn an toàn nhất cho nghiệp vụ.