Aufgabenplaner in Go (Golang): von cron bis asynq
In der modernen Serverentwicklung mit Go (Golang) besteht häufig die Notwendigkeit, Code zeitgesteuert oder mit Verzögerung auszuführen. Cache-Bereinigung, Versand von Benachrichtigungen, Berichtserstellung – all dies erfordert einen zuverlässigen Aufgabenplaner. In diesem Artikel werden wir drei beliebte Ansätze im Detail besprechen: das Standardpaket cron, die leichtgewichtige Bibliothek gocron und die verteilte Warteschlange asynq. Sie erfahren, welches Tool Sie für Ihr Projekt auf PythonLib wählen sollten.
1. Standard-cron für Go
Die Bibliothek github.com/robfig/cron/v3 ist der De-facto-Standard für die Planung wiederkehrender Aufgaben in Go. Sie verwendet die bekannte Syntax von cron-Ausdrücken (5 Felder) und unterstützt Sekunden, Zeitzonen und Wiederherstellung nach Paniken.
Installation und Basisbeispiel
go get github.com/robfig/cron/v3Beispiel für einen Planer, der eine Aufgabe alle 30 Sekunden ausführt:
package main
import ( "fmt" "github.com/robfig/cron/v3")
func main() { c := cron.New() // Aufgabe mit cron-Ausdruck hinzufügen: alle 30 Sekunden _, err := c.AddFunc("*/30 * * * * *", func() { fmt.Println("Aufgabe ausgeführt:", time.Now()) }) if err != nil { panic(err) } c.Start() // Hauptgoroutine blockieren select {}}Wichtige Merkmale:
- Unterstützung für Standard-cron-Ausdrücke (5 oder 6 Felder mit Sekunden)
- Automatische Wiederherstellung nach einer Panik in der Aufgabe
- Möglichkeit, die Zeitzone über
cron.WithLocation()festzulegen - Protokollierung über
cron.WithLogger()
Fortgeschrittene Nutzung: verkettete Jobs
c := cron.New(cron.WithSeconds())
// Aufgabe mit Namen zur Verwaltungid, _ := c.AddFunc("@every 5m", func() { fmt.Println("Wird alle 5 Minuten ausgeführt")})
// Aufgabe nach ID entfernenc.Remove(id)
// Planer anhaltenc.Stop()Die Bibliothek eignet sich ideal für einfache periodische Aufgaben innerhalb eines einzelnen Prozesses. Für verteilte Systeme (mehrere Replikate eines Go-Servers) ist jedoch eine externe Sperre erforderlich, damit die Aufgabe nicht gleichzeitig auf allen Knoten ausgeführt wird.
2. Gocron – leichter Scheduler mit Verkettungen
github.com/go-co-op/gocron bietet eine modernere API ohne cron-Ausdrücke. Anstelle von Zeichenketten verwenden Sie Methodenverkettungen. Dies ist besonders für Anfänger praktisch.
Beispiel mit gocron
package main
import ( "fmt" "time" "github.com/go-co-op/gocron")
func main() { s := gocron.NewScheduler(time.UTC) // Aufgabe wird alle 2 Minuten ausgeführt _, _ = s.Every(2).Minutes().Do(func() { fmt.Println("2 Minuten sind vergangen") }) // Aufgabe mit Verzögerung nach dem Start _, _ = s.Every(1).Day().At("10:30").Do(func() { fmt.Println("Täglich um 10:30") }) s.StartBlocking()}Vorteile von gocron:
- Menschenlesbare API:
.Every(10).Seconds() - Integrierte Unterstützung für verteilte Sperren über Redis (optional)
- Möglichkeit, eine Begrenzung der Ausführungsanzahl festzulegen
- Globale und lokale Fehlerbehandler
Wenn Sie eine einfache Lösung für einen Mikroservice ohne externe Abhängigkeiten benötigen, ist gocron eine ausgezeichnete Wahl. Es ist leichter als cron und erfordert keine Kenntnis der cron-Ausdruckssyntax.
3. Asynq – verteilte Warteschlange für verzögerte Aufgaben
github.com/hibiken/asynq ist nicht nur ein Planer, sondern ein vollwertiges Warteschlangensystem auf Basis von Redis. Es ermöglicht das Zurückstellen von Aufgaben, das Festlegen von Prioritäten, das Wiederholen fehlgeschlagener Aufgaben und die Verfolgung ihres Status über eine Weboberfläche.
Architektur von asynq
Asynq be
Auch in der Bibliothek
flume für Rust: Vollständiges Tutorial mit Beispielen
Generierung von QR-Codes mit PHP: Bibliothek phpqrcode und vollständiger Leitfaden
Konfiguration von Swift-Anwendungen: Tools und Bibliotheken für iOS/macOS
Boost für C++: Vollständiger Leitfaden mit Beispielen
PDF-Generierung in C++: Überblick über Bibliotheken und Werkzeuge