개요
Scheduler
를 Server
와 동시에 실행하여 주기적으로 작업을 처리할 수 있습니다. 스케줄러는 주기적으로 작업을 대기열에 추가하고, 클러스터 내의 이용 가능한 워커 서버가 해당 작업을 실행합니다.
중복된 작업을 피하기 위해 각 스케줄에 대해 하나의 스케줄러만 실행되도록 보장해야 합니다. 중앙 집중식 방식을 사용하면 동기화가 필요하지 않고 락을 사용하지 않고도 서비스를 실행할 수 있습니다.
주기적 작업을 동적으로 추가하거나 제거해야 하는 경우, 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