Loop nooit over 1 miljoen gebruikers in een request handler — spreid het werk via een queue, throttle tot wat elke provider kan verwerken, maak elke verzending idempotent, en stuur mislukkingen naar een DLQ om opnieuw te proberen. De API-aanroep zet alleen in de queue; workers doen de trage I/O.
Architectuur
Admin ─▶ Campaign API ─▶ [job in queue] ─▶ Kafka/SQS ─┐
▼
┌──────────────── Worker pool (autoscaled) ───────────────┐
│ claim ─▶ dedup(Redis SETNX) ─▶ rate-limiter ─▶ provider │
└──────────┬──────────────────────────────┬───────────────┘
│ ok │ fail (5xx/timeout)
▼ ▼
sent_log (DB) Retry (backoff) ─▶ DLQ
