Tempo Limite da Tarefa

Nesta página, vou apresentar como definir o tempo limite ou prazo para uma tarefa e como lidar com operações de cancelamento.

Ao enfileirar uma tarefa usando Client, você pode especificar Timeout ou Deadline como uma opção. Isso permite que o servidor desista da tarefa e recupere recursos para outras tarefas se a tarefa não for processada antes do tempo limite ou prazo.
Essas opções definirão o tempo limite ou prazo do context.Context e o passarão como o primeiro parâmetro para o seu manipulador.

*Nota: O tempo limite é relativo ao início do processamento do manipulador da tarefa.

Por exemplo, se você tiver uma tarefa que precisa ser concluída em 30 segundos, você pode definir o tempo limite para 30 * time.Second.

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

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

Se você tiver uma tarefa que precisa ser concluída até um horário específico, você pode definir o prazo para a tarefa.
Por exemplo, se você tiver uma tarefa que precisa ser concluída antes de 2020-12-25, você pode passá-la como uma opção Deadline.

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

Contexto da Tarefa nos Manipuladores

Agora que criamos uma tarefa usando as opções Timeout e Deadline, devemos respeitar esse valor lendo o canal Done no contexto.

O primeiro parâmetro passado para Handler é context.Context. Você deve escrever seu manipulador de forma que abandone o trabalho ao receber um sinal de cancelamento do contexto.

func meuManipulador(ctx context.Context, tarefa *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- fazerTrabalho(tarefa)
    }()
    select {
    case <-ctx.Done():
        // Sinal de cancelamento recebido, abandone este trabalho.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

Cancelando Tarefas via CLI

O CLI asynq possui um comando cancel que pode cancelar o ID de uma tarefa ativa.
Você pode usar o comando workers para verificar as tarefas atualmente ativas e obter o ID da tarefa a ser cancelada.

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