작업 시간 제한

이 페이지에서는 작업의 시간 제한 또는 데드라인을 설정하고 취소 작업을 처리하는 방법을 소개합니다.

Client를 사용하여 작업을 대기열에 넣을 때, Timeout 또는 Deadline을 옵션으로 지정할 수 있습니다. 이를 통해 작업이 제한 시간 또는 데드라인 전에 처리되지 않으면 서버가 해당 작업을 포기하고 다른 작업을 위해 리소스를 회수할 수 있습니다.
이러한 옵션은 context.Context의 시간 제한 또는 데드라인을 설정하고 이를 처리기의 첫 번째 매개변수로 전달합니다.

*참고: 시간 제한은 처리기가 작업 처리를 시작한 시점을 기준으로 합니다.

예를 들어, 30초 내에 완료해야 하는 작업이 있다면 시간 제한을 30*time.Second로 설정할 수 있습니다.

c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})

err := c.Enqueue(task, asynq.Timeout(30 * time.Second))

특정 시간 전에 완료해야 하는 작업이 있는 경우 데드라인을 설정할 수 있습니다.
예를 들어, 2020-12-25 이전에 완료해야 하는 작업이 있다면 이를 Deadline 옵션으로 전달할 수 있습니다.

xmas := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(xmas))

처리기 내 작업 취소

이제 TimeoutDeadline 옵션을 사용하여 작업을 생성했으므로, 해당 값을 Done 채널에서 읽어서 존중해야 합니다.

Handler에 전달되는 첫 번째 매개변수는 context.Context입니다. 작업이 취소 신호를 받으면 해당하는 취소 신호에 따라 작업을 중단하는 방식으로 처리기를 작성해야 합니다.

func myHandler(ctx context.Context, task *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- doWork(task)
    }()
    select {
    case <-ctx.Done():
        // 취소 신호를 받았으므로 이 작업을 중단합니다.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

CLI를 통한 작업 취소

asynq CLI에는 활성 작업의 ID를 취소할 수 있는 cancel 명령이 있습니다.
현재 활성 작업을 확인하고 취소할 작업의 ID를 얻을 수 있도록 workers 명령을 사용할 수 있습니다.

asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]