Non iterare mai su 1M di utenti dentro un request handler: distribuisci il carico tramite una coda, applica un throttling pari a ciò che ogni provider è in grado di accettare, rendi ogni invio idempotente e instrada i fallimenti verso una DLQ per il retry. La chiamata API si limita ad accodare; i worker svolgono l'I/O lento.
Architettura
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
