Đừng bao giờ lặp qua 1 triệu user ngay trong request handler — hãy fan-out qua queue, throttle theo mức mỗi provider chịu được, làm mỗi lần gửi idempotent, và đẩy lỗi vào DLQ để retry. Lời gọi API chỉ enqueue; worker mới làm phần I/O chậm.
Kiến trúc
text
Admin ─▶ Campaign API ─▶ [enqueue job] ─▶ Kafka/SQS ─┐
▼
┌──────────────── Worker pool (autoscaled) ───────────────┐
│ claim ─▶ dedup(Redis SETNX) ─▶ rate-limiter ─▶ provider │
└──────────┬──────────────────────────────┬───────────────┘
│ ok │ fail (5xx/timeout)
▼ ▼
sent_log (DB) Retry (backoff) ─▶ DLQ
