リクエストハンドラー内で100万ユーザーをループしてはいけません。キューを介してファンアウトし、各プロバイダーが受け入れられる量にスロットリングし、すべての送信を**冪等(idempotent)**にし、失敗はリトライのためにDLQへ振り分けます。APIコールはエンキューするだけで、遅い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
