Categorygithub.com/SbstnErhrdt/go-job-dispatcher
repositorypackage
0.0.0-20230406082838-c93f73621672
Repository: https://github.com/sbstnerhrdt/go-job-dispatcher.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

Job-Dispatcher

This repository contains the code of an atomic like jobs dispatcher. It is backed with sql database or with a redis key-value store.

Status

Work in progress

Features

  • Counts the attempts of jobs
  • Heartbeat to store the current status of the job
  • Priority
  • Multi-Instance Jobs

Dependencies

  • SQL
  • Redis

Environment Variables

# SQL Database
SQL_TYPE=MYSQL
SQL_HOST=localhost
SQL_USER=root
SQL_PASSWORD=test
SQL_PORT=3306
SQL_DATABASE=test

# Clean jobs after n seconds / minutes ... SQL INTERVAL
CLEAN_STALLED_JOBS_INTERVAL=20 SECOND

# Application port
PORT=18989

# Job dispatcher prefix for redis
JOB_DISPATCHER_REDIS_PREFIX=job_dispatcher

# Redis Key Value Store
REDIS_HOST=192.168.157.33
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DATABASE=0

Tests

Run the tests via the script

sh tests.sh

or via the golang command

go test ./...

To test the redis version just add the following environment variable

export TEST_ENV=REDIS

Client

Create a new job

// create uuid
uid := uuid.New()
// init job dispatcher client
client := job_dispatcher.NewClient(
    https: //job-dispatcher.endpoint.net,
    "web-crawler",
    uid,
)
// create new job
newJob := job_dispatcher.NewJobDTO{
    Name:           "Search",
    Priority:       10,
    WorkerInstance: "web-crawler",
    Tasks: []job_dispatcher.JobTask{
        {
            Version: "0.1",
            Name:    "daily search",
            Type:    "search",
            Execute: map[string]Interface{}{
                "Name": "Company Name",
            },
        },
    },
}
// send job to dispatcher
res, err := client.CreateJob(newJob)

Receive the latest job in the queue

// create uuid
uid := uuid.New()
// init job dispatcher client
client := job_dispatcher.NewClient(
    https: //job-dispatcher.endpoint.net,
    "web-crawler",
    uid,
)
// get the latest job from the queue
err := client.GetJob("job-type")
if err != nil {
    return
}

// start the job
err := client.StartCurrentJob()

// send a heartbeat with metrics of the job to the queue
err := client.HeartBeat(...)

// release the current job if something fails
_ = client.ReleaseCurrentJob()

// complete the jobs
_ := client.MarkCurrentJobAsCompleted()

Deployment

Via docker

docker run -p 8080:8080 ese7en/go-job-dispatcher