요청 핸들러에서 100만 명의 사용자를 절대 루프로 순회하지 마십시오 — **큐를 통해 팬아웃(fan out)**하고, 각 provider가 수용할 수 있는 수준으로 throttle하며, 모든 전송을 idempotent하게 만들고, 실패는 재시도를 위해 DLQ로 라우팅하십시오. API 호출은 enqueue만 수행하고, 느린 I/O는 worker가 처리합니다.
아키텍처
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
