2.4 KiB
2.4 KiB
Batch jobs — migrate / improve later
Campaign CSV runs and scheduled sends are UI + data-model only for now. Actual delivery is stubbed.
Current stack (Docker)
| Service | Status | Role |
|---|---|---|
| Redis | Running, unused | Recommended job broker |
| Kafka | Profile data-plane, off |
Event stream at scale |
| Postgres | Running | Job state + queue (fallback) |
| ClickHouse | Profile analytics, off |
Analytics rollups |
| MinIO | Profile object-storage, off |
CSV / export storage |
Recommended migration path
Phase 1 — Redis worker (short term)
- Wire
REDIS_URL=redis://redis:6379/0into backend and a newworkerservice (same image as API, differentcommand). - Add Celery, RQ, or ARQ to
backend/requirements.txt. - Move campaign run logic from stub endpoints to background tasks:
run_campaign_csv_upload(upload_id)run_campaign_automation(campaign_id)— batch all validated CSVs
- Campaign CSV upload with
run_mode=on_uploadshould enqueue a job after validation instead of inline stub. - Scheduled campaigns (
run_mode=scheduled) need a periodic beat/cron worker to enqueue due runs.
Phase 2 — Kafka (when volume grows)
docker compose --profile data-plane up -d- Publish outbound SMS events; consume with dedicated send workers.
- Use ClickHouse profile for delivery analytics.
Phase 3 — Object storage
docker compose --profile object-storage up -d- Store campaign CSVs in MinIO instead of local
uploads/campaigns/.
Campaign send integration checklist
- Replace stub
POST .../runhandlers with worker enqueue - Implement Ultronsms batch/chunked send in worker
- Persist per-row send results (success / failure / message_id)
- Retry failed rows with backoff
- Respect
scheduled_atfor scheduled campaigns - Idempotency key per CSV row to avoid duplicate sends on retry
- Rate limiting per sender / DLT template
Files to touch when implementing
backend/app/routes_campaigns.py— replace_stub_run_uploadwith enqueuebackend/app/campaign_csv_service.py— row iteration + send hookbackend/app/message_send_service.py— reuse template validation + gateway clientdocker-compose.yml—workerservice + Redis dependency on backendfrontend/src/features/campaigns/— show real run progress / row counts