57 lines
1.5 KiB
Markdown
57 lines
1.5 KiB
Markdown
# ADR-0024: Background Job Scheduler
|
|
|
|
## Status
|
|
Accepted
|
|
|
|
## Context
|
|
The platform needs background job processing for:
|
|
- Periodic tasks (cron jobs)
|
|
- Asynchronous processing
|
|
- Long-running operations
|
|
- Retry logic for failed jobs
|
|
|
|
Options considered:
|
|
1. **asynq (Redis-based)** - Simple, feature-rich
|
|
2. **cron + custom queue** - Build our own
|
|
3. **Kafka consumers** - Use event bus
|
|
4. **External service** - AWS SQS, etc.
|
|
|
|
## Decision
|
|
Use **asynq** (Redis-backed) for job scheduling:
|
|
|
|
1. **Cron jobs**: `github.com/robfig/cron/v3` for periodic tasks
|
|
2. **Job queue**: `github.com/hibiken/asynq` for async jobs
|
|
3. **Storage**: Redis (shared with cache)
|
|
4. **Features**: Retries, backoff, job status tracking
|
|
|
|
**Rationale:**
|
|
- Simple, Redis-backed (no new infrastructure)
|
|
- Good Go library support
|
|
- Built-in retry and backoff
|
|
- Job status tracking
|
|
- Easy to integrate
|
|
- Can scale horizontally (multiple workers)
|
|
|
|
## Consequences
|
|
|
|
### Positive
|
|
- Simple (uses existing Redis)
|
|
- Feature-rich (retries, backoff)
|
|
- Good performance
|
|
- Easy to scale
|
|
- Job status tracking
|
|
|
|
### Negative
|
|
- Tied to Redis (but we're already using it)
|
|
- Requires Redis to be available
|
|
|
|
### Implementation Notes
|
|
- Install: `github.com/hibiken/asynq` and `github.com/robfig/cron/v3`
|
|
- Create `pkg/scheduler/scheduler.go` interface
|
|
- Implement `internal/infra/scheduler/asynq_scheduler.go`
|
|
- Register jobs in `internal/infra/scheduler/job_registry.go`
|
|
- Start worker in fx lifecycle
|
|
- Configure retry policies (exponential backoff)
|
|
- Add job monitoring endpoint
|
|
|