개요

SchedulerServer와 동시에 실행하여 주기적으로 작업을 처리할 수 있습니다. 스케줄러는 주기적으로 작업을 대기열에 추가하고, 클러스터 내의 이용 가능한 워커 서버가 해당 작업을 실행합니다.

중복된 작업을 피하기 위해 각 스케줄에 대해 하나의 스케줄러만 실행되도록 보장해야 합니다. 중앙 집중식 방식을 사용하면 동기화가 필요하지 않고 락을 사용하지 않고도 서비스를 실행할 수 있습니다.

주기적 작업을 동적으로 추가하거나 제거해야 하는 경우, Scheduler를 직접 사용하는 대신 PeriodicTaskManager를 사용하십시오. 자세한 정보는 이 위키를 참조하십시오.

시간대

기본적으로 주기적 작업은 UTC 시간을 사용하지만, SchedulerOpts를 사용하여 사용되는 시간대를 변경할 수 있습니다.

// 예를 들어, 기본 UTC 시간대 대신 America/Los_An젤레스 시간대를 사용합니다.
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
    panic(err)
}
scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        Location: loc,
    },
)

작업 등록

주기적으로 작업을 대기열에 추가하려면, 스케줄러와 작업 레코드를 등록해야 합니다.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

task := asynq.NewTask("example_task", nil)

// cron 규칙 문자열을 사용하여 스케줄을 지정할 수 있습니다.
entryID, err := scheduler.Register("* * * * *", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("등록된 항목: %q\n", entryID)

// 간격을 지정하기 위해 "@every "를 사용할 수도 있습니다.
entryID, err = scheduler.Register("@every 30s", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("등록된 항목: %q\n", entryID)

// 옵션을 전달할 수도 있습니다.
entryID, err = scheduler.Register("@every 24h", task, asynq.Queue("myqueue"))
if err != nil {
    log.Fatal(err)
}
log.Printf("등록된 항목: %q\n", entryID)

스케줄러 실행

스케줄러를 시작하려면, 스케줄러에서 Run을 호출하십시오.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

// ... 작업 등록

if err := scheduler.Run(); err != nil {
    log.Fatal(err)
}

Run을 호출하면 TERM 또는 INT 시그널 (예: Ctrl-C)을 기다립니다.

에러 처리

스케줄러가 작업을 대기열에 넣지 못하는 경우에 대한 에러를 처리하기 위해 핸들러 함수를 제공할 수 있습니다.

func handleEnqueueError(task *asynq.Task, opts []asynq.Option, err error) {
    // 여러분의 에러 처리 논리
}

scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        EnqueueErrorHandler: handleEnqueueError,
    },
)

CLI를 통한 확인

CLI에는 스케줄러 레코드 확인을 위한 cron이라는 하위 명령어가 있습니다.

현재 실행 중인 스케줄러의 모든 레코드를 보려면, 다음 명령을 실행할 수 있습니다.

asynq cron ls

이 명령은 각 레코드의 ID, 스케줄 규격, 다음 대기열 시간, 마지막 대기열 시간을 포함한 목록을 출력합니다.

또한 각 레코드의 히스토리를 보려면 다음 명령을 실행할 수 있습니다.

asynq cron history