wakapi/config/jobqueue.go

89 lines
1.8 KiB
Go
Raw Normal View History

package config
import (
"fmt"
"math"
"runtime"
2023-04-03 15:40:57 +03:00
"github.com/emvi/logbuch"
"github.com/muety/artifex/v2"
)
2022-11-20 12:59:06 +03:00
var jobQueues map[string]*artifex.Dispatcher
var jobCounts map[string]int
const (
QueueDefault = "wakapi.default"
QueueProcessing = "wakapi.processing"
QueueReports = "wakapi.reports"
QueueMails = "wakapi.mail"
QueueImports = "wakapi.imports"
QueueHousekeeping = "wakapi.housekeeping"
)
2022-11-20 12:59:06 +03:00
type JobQueueMetrics struct {
Queue string
EnqueuedJobs int
FinishedJobs int
}
func init() {
2022-11-20 12:59:06 +03:00
jobQueues = make(map[string]*artifex.Dispatcher)
2023-04-03 15:40:57 +03:00
}
2023-04-03 15:40:57 +03:00
func StartJobs() {
InitQueue(QueueDefault, 1)
InitQueue(QueueProcessing, halfCPUs())
InitQueue(QueueReports, 1)
InitQueue(QueueMails, 1)
InitQueue(QueueImports, 1)
InitQueue(QueueHousekeeping, halfCPUs())
}
func InitQueue(name string, workers int) error {
2022-11-20 12:59:06 +03:00
if _, ok := jobQueues[name]; ok {
return fmt.Errorf("queue '%s' already existing", name)
}
logbuch.Info("creating job queue '%s' (%d workers)", name, workers)
2022-11-20 12:59:06 +03:00
jobQueues[name] = artifex.NewDispatcher(workers, 4096)
jobQueues[name].Start()
return nil
}
func GetDefaultQueue() *artifex.Dispatcher {
2022-11-20 12:59:06 +03:00
return GetQueue(QueueDefault)
}
func GetQueue(name string) *artifex.Dispatcher {
2022-11-20 12:59:06 +03:00
if _, ok := jobQueues[name]; !ok {
InitQueue(name, 1)
}
2022-11-20 12:59:06 +03:00
return jobQueues[name]
}
func GetQueueMetrics() []*JobQueueMetrics {
metrics := make([]*JobQueueMetrics, 0, len(jobQueues))
for name, queue := range jobQueues {
metrics = append(metrics, &JobQueueMetrics{
Queue: name,
EnqueuedJobs: queue.CountEnqueued(),
FinishedJobs: queue.CountDispatched(),
})
}
return metrics
}
func CloseQueues() {
2022-11-20 12:59:06 +03:00
for _, q := range jobQueues {
q.Stop()
}
}
func allCPUs() int {
return runtime.NumCPU()
}
func halfCPUs() int {
return int(math.Ceil(float64(runtime.NumCPU()) / 2.0))
}