2.3 KiB
2.3 KiB
Story 5.5: Scheduler and Background Jobs System
Metadata
- Story ID: 5.5
- Title: Scheduler and Background Jobs System
- Epic: 5 - Infrastructure Adapters
- Status: Pending
- Priority: High
- Estimated Time: 6-8 hours
- Dependencies: 1.1, 5.1
Goal
Implement a complete scheduler and background job system with cron jobs, job queues, retries, and job status tracking.
Description
This story implements a scheduler system using Asynq (Redis-backed) that supports cron jobs for periodic tasks and job queues for background processing. Jobs can be registered from modules and tracked.
Deliverables
1. Scheduler Interface (pkg/scheduler/scheduler.go)
Schedulerinterface with:Cron(spec string, job JobFunc) error- Schedule cron jobEnqueue(queue string, payload any) error- Enqueue jobRegisterJob(name string, handler JobHandler) error- Register job handler
2. Asynq Implementation (internal/infra/scheduler/asynq_scheduler.go)
- Redis-backed job queue
- Cron jobs for periodic tasks
- Job retries and backoff
- Job status tracking
- Job result storage
3. Job Registry (internal/infra/scheduler/job_registry.go)
- Register jobs from modules
- Start job processor on app startup
- Job lifecycle management
4. Example Jobs
- Cleanup expired tokens (daily)
- Send digest emails (weekly)
- Database cleanup tasks
5. Job Monitoring API
GET /api/v1/jobs/status- Job status endpoint- Job history and statistics
6. Configuration
- Scheduler config in
config/default.yaml:- Redis connection (shared with cache)
- Concurrency settings
- Retry settings
7. DI Integration
- Provider function for Scheduler
- Register in DI container
Acceptance Criteria
- Scheduler interface is defined
- Cron jobs can be scheduled
- Jobs can be enqueued
- Jobs are processed correctly
- Job retries work
- Job status is tracked
- Example jobs run on schedule
- Job monitoring API works
Files to Create/Modify
pkg/scheduler/scheduler.go- Scheduler interfaceinternal/infra/scheduler/asynq_scheduler.go- Asynq implementationinternal/infra/scheduler/job_registry.go- Job registryinternal/infra/scheduler/jobs.go- Example jobsinternal/di/providers.go- Add scheduler providerconfig/default.yaml- Add scheduler config