Nunca recorras 1M de usuarios dentro de un handler de request — reparte el trabajo a través de una cola (fan out), limita el ritmo a lo que cada proveedor puede aceptar, haz que cada envío sea idempotente y enruta los fallos a una DLQ para reintentar. La llamada a la API solo encola; los workers hacen el I/O lento.
Arquitectura
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
