Job Queues
The jobQueue
library in Go aims to serve as a Cron replacement, enabling the scheduled and event-driven execution of tasks in an organized manner.
Library Requirements
Core Requirements
-
Job Management Structure: A structure to catalog all jobs, providing methods to add and remove jobs.
-
YAML Import: A function to import job definitions from a YAML file.
-
Job Exclusivity: Jobs should be either concurrently runnable or exclusive.
-
System Resource Monitoring: Real-time monitoring of system resources like CPU, memory, etc., consumed by the jobs.
-
Priority and Distribution: Each job should have a priority. Jobs should also be evenly distributed across available resources.
-
Single and Recurring Jobs: Support for both one-time and recurring jobs.
-
Logging: Each job should have a log written that includes Process ID, memory usage, start time, end time, and exit code.
-
Priority Escalation: If a job is not run due to its priority, its priority should escalate over time.
Additional Requirements
-
Error Handling: Mechanisms for effective error handling, especially for failed or terminated jobs.
-
Notification System: Optionally, an interface for notifications on job failures or completions.
-
Resource Limits: Ability to set resource limits per job.
-
Job Dependencies: Optional support for jobs that depend on the successful completion of other jobs.
-
Testability: The library should be easy to test, ideally via unit tests.
-
Documentation: Comprehensive API documentation and a guide on how the library works.
Documentation
JobData
Structure
Fields
-
Id (JobIDType)
- Unique identifier for the job.
-
Priority (int)
- The priority level of the job in the queue.
-
Exclusive (bool)
- Specifies whether the job should be executed exclusively or not.
-
MaxRuns (int)
- The maximum number of times the job should be executed.
-
Concurrency (int)
- The maximum number of concurrent executions of the job.
-
LastRun (time.Time)
- Timestamp for when the job was last executed.
-
NextRun (time.Time)
- Timestamp for the next scheduled execution of the job.
-
Logs ([]JobLog)
- An array of log entries for the job.
-
Schedule (string)
- A cron expression that defines the execution schedule.
-
Status (JobStatus)
- The current status of the job (e.g.,
Running
,Completed
).
- The current status of the job (e.g.,
-
Timeout (time.Duration)
- The maximum duration the job is allowed to run.
-
Retries (int)
- The number of times the job will be retried if it fails.
-
RetryDelay (time.Duration)
- The delay before retrying the job if it fails.
-
ResourceLimits (struct)
-
Resource limits for CPU and Memory.
-
CPULimit (float64)
- CPU limit for the job.
-
MemoryLimit (uint64)
- Memory limit for the job.
-
-
-
Dependencies ([]JobIDType)
- List of job IDs this job depends on.
-
Tags ([]string)
- Tags associated with the job for easier categorization.
-
Metadata (map[string]interface{})
- Metadata for extending the structure with additional information.
-
Stats (JobStats)
- Job-related statistics.
Job
Structure
Inherits fields from JobData
and adds additional functional fields.
Fields
-
Runnable (Runnable)
- A function or method that defines the action of the job. This is what gets executed.
-
scheduleImpl (cron.Schedule)
- Internal cron schedule implementation that interprets the
Schedule
string inJobData
.
- Internal cron schedule implementation that interprets the
-
*TelemetryHooks ([]func(JobLog))
- An array of functions that will be called for telemetry during the job's execution. These hooks can update a
JobLog
object.
- An array of functions that will be called for telemetry during the job's execution. These hooks can update a
-
Failover (func() error)
- A function that gets called if the primary execution fails for some reason. It's meant for fail over mechanisms.
-
ctx (context.Context)
- A context that can carry deadlines, cancellations, and other request-scoped values across API boundaries and between processes.
-
mu (sync.Mutex)
- Mutex for synchronizing access to the job's fields, making the job safe for concurrent use.