Aufgabenzeitüberschreitung
In dieser Seite werde ich erklären, wie man das Zeitlimit oder die Frist für eine Aufgabe festlegt und wie man Stornierungsoperationen behandelt.
Beim Einreihen einer Aufgabe mit dem Client
können Sie Timeout
oder Deadline
als Option angeben. Dies ermöglicht es dem Server, die Aufgabe aufzugeben und Ressourcen für andere Aufgaben zurückzugewinnen, wenn die Aufgabe vor dem Timeout oder der Frist nicht bearbeitet wird.
Diese Optionen setzen das Zeitlimit oder die Frist des context.Context
und geben es als ersten Parameter an Ihren Handler.
*Hinweis: Das Zeitlimit bezieht sich auf den Zeitpunkt, an dem der Handler mit der Verarbeitung der Aufgabe beginnt.
Wenn Sie beispielsweise eine Aufgabe haben, die innerhalb von 30 Sekunden abgeschlossen sein muss, können Sie das Zeitlimit auf 30*time.Second
setzen.
c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})
err := c.Enqueue(task, asynq.Timeout(30 * time.Second))
Wenn Sie eine Aufgabe haben, die bis zu einem bestimmten Zeitpunkt abgeschlossen sein muss, können Sie die Frist für die Aufgabe festlegen.
Beispielsweise, wenn Sie eine Aufgabe haben, die vor dem 2020-12-25
abgeschlossen sein muss, können Sie dies als Deadline
-Option übergeben.
xmas := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(xmas))
Aufgabenkontext in Handlern
Nachdem wir eine Aufgabe mit den Optionen Timeout
und Deadline
erstellt haben, müssen wir diesen Wert respektieren, indem wir den Done
-Kanal im Kontext lesen.
Der erste übergebene Parameter an Handler
ist context.Context
. Sie sollten Ihren Handler so schreiben, dass er die Arbeit aufgibt, wenn er ein Stornierungssignal aus dem Kontext erhält.
func myHandler(ctx context.Context, task *asynq.Task) error {
c := make(chan error, 1)
go func() {
c <- doWork(task)
}()
select {
case <-ctx.Done():
// Stornierungssignal erhalten, diese Arbeit aufgeben.
return ctx.Err()
case res := <-c:
return res
}
}
Aufgabenstornierung über die Befehlszeilenschnittstelle (CLI)
Die asynq
CLI verfügt über einen cancel
-Befehl, mit dem die ID einer aktiven Aufgabe storniert werden kann.
Sie können den workers
-Befehl verwenden, um die derzeit aktiven Aufgaben zu überprüfen und die ID der zu stornierenden Aufgabe zu erhalten.
asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]