Aldri loop over 1M brukere i en request-handler — spre arbeidet ut via en kø, strup ned til det hver leverandør kan ta imot, gjør hver sending idempotent, og rut feil til en DLQ for retry. API-kallet gjør bare enqueue; workerne gjør den trege I/O-en.
Arkitektur
Admin ─▶ Campaign API ─▶ [enqueue job] ─▶ Kafka/SQS ─┐
▼
┌──────────────── Worker-pool (autoskalert) ──────────────┐
│ claim ─▶ dedup(Redis SETNX) ─▶ rate-limiter ─▶ provider │
└──────────┬──────────────────────────────┬───────────────┘
│ ok │ fail (5xx/timeout)
▼ ▼
sent_log (DB) Retry (backoff) ─▶ DLQ
