อย่าวนลูปผู้ใช้ 1 ล้านคนภายใน request handler เด็ดขาด — ให้ กระจายงานผ่าน queue (fan out) ควบคุมอัตราการส่ง (throttle) ให้พอดีกับที่แต่ละ provider รับได้ ทำให้ทุกการส่งเป็น idempotent และส่ง failure ไปที่ DLQ เพื่อ retry การเรียก API เพียงแค่ enqueue เท่านั้น ส่วน worker เป็นผู้ทำงาน I/O ที่ช้า
สถาปัตยกรรม
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
