mirror of
https://github.com/hibiken/asynq.git
synced 2024-12-25 23:32:17 +08:00
Add option to configure task check interval
This commit is contained in:
parent
1e0bf88bf3
commit
16ec43cbca
@ -37,6 +37,7 @@ type processor struct {
|
||||
// orderedQueues is set only in strict-priority mode.
|
||||
orderedQueues []string
|
||||
|
||||
taskCheckInterval time.Duration
|
||||
retryDelayFunc RetryDelayFunc
|
||||
isFailureFunc func(error) bool
|
||||
|
||||
@ -76,6 +77,7 @@ type processorParams struct {
|
||||
broker base.Broker
|
||||
baseCtxFn func() context.Context
|
||||
retryDelayFunc RetryDelayFunc
|
||||
taskCheckInterval time.Duration
|
||||
isFailureFunc func(error) bool
|
||||
syncCh chan<- *syncRequest
|
||||
cancelations *base.Cancelations
|
||||
@ -102,6 +104,7 @@ func newProcessor(params processorParams) *processor {
|
||||
clock: timeutil.NewRealClock(),
|
||||
queueConfig: queues,
|
||||
orderedQueues: orderedQueues,
|
||||
taskCheckInterval: params.taskCheckInterval,
|
||||
retryDelayFunc: params.retryDelayFunc,
|
||||
isFailureFunc: params.isFailureFunc,
|
||||
syncRequestCh: params.syncCh,
|
||||
@ -178,7 +181,7 @@ func (p *processor) exec() {
|
||||
// Sleep to avoid slamming redis and let scheduler move tasks into queues.
|
||||
// Note: We are not using blocking pop operation and polling queues instead.
|
||||
// This adds significant load to redis.
|
||||
time.Sleep(time.Second)
|
||||
time.Sleep(p.taskCheckInterval)
|
||||
<-p.sema // release token
|
||||
return
|
||||
case err != nil:
|
||||
|
@ -67,6 +67,7 @@ func newProcessorForTest(t *testing.T, r *rdb.RDB, h Handler) *processor {
|
||||
broker: r,
|
||||
baseCtxFn: context.Background,
|
||||
retryDelayFunc: DefaultRetryDelayFunc,
|
||||
taskCheckInterval: defaultTaskCheckInterval,
|
||||
isFailureFunc: defaultIsFailureFunc,
|
||||
syncCh: syncCh,
|
||||
cancelations: base.NewCancelations(),
|
||||
@ -542,6 +543,7 @@ func TestProcessorWithExpiredLease(t *testing.T) {
|
||||
logger: testLogger,
|
||||
broker: rdbClient,
|
||||
baseCtxFn: context.Background,
|
||||
taskCheckInterval: defaultTaskCheckInterval,
|
||||
retryDelayFunc: DefaultRetryDelayFunc,
|
||||
isFailureFunc: defaultIsFailureFunc,
|
||||
syncCh: syncCh,
|
||||
@ -696,6 +698,7 @@ func TestProcessorWithStrictPriority(t *testing.T) {
|
||||
logger: testLogger,
|
||||
broker: rdbClient,
|
||||
baseCtxFn: context.Background,
|
||||
taskCheckInterval: defaultTaskCheckInterval,
|
||||
retryDelayFunc: DefaultRetryDelayFunc,
|
||||
isFailureFunc: defaultIsFailureFunc,
|
||||
syncCh: syncCh,
|
||||
|
20
server.go
20
server.go
@ -15,10 +15,10 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
"github.com/hibiken/asynq/internal/base"
|
||||
"github.com/hibiken/asynq/internal/log"
|
||||
"github.com/hibiken/asynq/internal/rdb"
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
// Server is responsible for task processing and task lifecycle management.
|
||||
@ -104,6 +104,15 @@ type Config struct {
|
||||
// If this is defined, then it MUST return a non-nil context
|
||||
BaseContext func() context.Context
|
||||
|
||||
// TaskCheckInterval specifies the interval between checks for new tasks to process when all queues are empty.
|
||||
//
|
||||
// Be careful not to set this value too low because it adds significant load to redis.
|
||||
//
|
||||
// If set to a zero or negative value, NewServer will overwrite the value with default value.
|
||||
//
|
||||
// By default, TaskCheckInterval is set to 1 seconds.
|
||||
TaskCheckInterval time.Duration
|
||||
|
||||
// Function to calculate retry delay for a failed task.
|
||||
//
|
||||
// By default, it uses exponential backoff algorithm to calculate the delay.
|
||||
@ -390,6 +399,8 @@ var defaultQueueConfig = map[string]int{
|
||||
}
|
||||
|
||||
const (
|
||||
defaultTaskCheckInterval = 1 * time.Second
|
||||
|
||||
defaultShutdownTimeout = 8 * time.Second
|
||||
|
||||
defaultHealthCheckInterval = 15 * time.Second
|
||||
@ -414,6 +425,12 @@ func NewServer(r RedisConnOpt, cfg Config) *Server {
|
||||
if n < 1 {
|
||||
n = runtime.NumCPU()
|
||||
}
|
||||
|
||||
taskCheckInterval := cfg.TaskCheckInterval
|
||||
if taskCheckInterval <= 0 {
|
||||
taskCheckInterval = defaultTaskCheckInterval
|
||||
}
|
||||
|
||||
delayFunc := cfg.RetryDelayFunc
|
||||
if delayFunc == nil {
|
||||
delayFunc = DefaultRetryDelayFunc
|
||||
@ -503,6 +520,7 @@ func NewServer(r RedisConnOpt, cfg Config) *Server {
|
||||
logger: logger,
|
||||
broker: rdb,
|
||||
retryDelayFunc: delayFunc,
|
||||
taskCheckInterval: taskCheckInterval,
|
||||
baseCtxFn: baseCtxFn,
|
||||
isFailureFunc: isFailureFunc,
|
||||
syncCh: syncCh,
|
||||
|
Loading…
Reference in New Issue
Block a user