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]