Aufgabenwarteschlangen in Go (Golang): Die besten Bibliotheken und Werkzeuge

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Aufgabenwarteschlangen für Go (Golang): Vollständiger Leitfaden zu Bibliotheken und Werkzeugen



In der modernen Entwicklung mit Go (Golang) ist die Verarbeitung von Hintergrundaufgaben und asynchronen Operationen eine kritische Aufgabe. Ob es sich um das Senden von E-Mails, die Generierung von Berichten, die Bildverarbeitung oder die Interaktion mit externen APIs handelt – Aufgabenwarteschlangen (task queues) ermöglichen es, den Hauptthread der Anwendung zu entlasten und ihre Ausfallsicherheit zu erhöhen. In diesem Artikel betrachten wir die besten Bibliotheken für die Arbeit mit Warteschlangen in Go, ihre Besonderheiten und Anwendungsbeispiele.



Was ist eine Aufgabenwarteschlange und warum wird sie benötigt?



Eine Aufgabenwarteschlange ist ein Mechanismus, der es ermöglicht, die Ausführung ressourcenintensiver oder langer Operationen in den Hintergrund zu verschieben. Die Hauptvorteile sind:

  • Asynchronität: Der Benutzer wartet nicht auf den Abschluss einer schweren Operation.
  • Skalierbarkeit: Sie können viele Worker für die parallele Verarbeitung starten.
  • Ausfallsicherheit: Wenn ein Worker ausfällt, bleibt die Aufgabe in der Warteschlange und wird von einem anderen ausgeführt.
  • Planung: Verzögerter Start von Aufgaben (z. B. nach 1 Stunde).


Die 3 besten Bibliotheken für Aufgabenwarteschlangen in Go



1. Asynq



Asynq ist eine moderne, leistungsstarke und einfach zu verwendende Bibliothek für verteilte Aufgabenwarteschlangen, die auf Redis basiert. Entwickelt vom Google-Team und aktiv von der Community unterstützt.



Hauptmerkmale:

  • Funktioniert auf Basis von Redis (empfohlen wird Version 6.0+).
  • Unterstützung für verzögerte Aufgaben (scheduled tasks).
  • Integrierte Weboberfläche zur Überwachung (Asynqmon).
  • Dead-Letter-Warteschlange für fehlgeschlagene Aufgaben.
  • Aufgabengruppen (task groups) zur logischen Gruppierung.
  • Wiederholungsversuche mit konfigurierbarer Wiederholungsrichtlinie.


Anwendungsbeispiel:



package main

import ( "context" "fmt" "log" "time"

"github.com/hibiken/asynq")

// Definieren des Aufgabentypsconst TypeEmailDelivery = "email:deliver"

// Datenstruktur für die Aufgabetype EmailTaskPayload struct { UserID int TemplateID string}

// Aufgaben-Handlerfunc HandleEmailTask(ctx context.Context, t *asynq.Task) error { var payload EmailTaskPayload if err := json.Unmarshal(t.Payload(), &payload); err != nil { return fmt.Errorf("json.Unmarshal failed: %v: %w", err, asynq.SkipRetry) } log.Printf("Sende E-Mail an Benutzer %d mit Vorlage %s", payload.UserID, payload.TemplateID) // Hier die Logik zum Senden der E-Mail return nil}

func main() { // Client zum Einreihen von Aufgaben client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) defer client.Close()

// Erstellen einer Aufgabe payload, _ := json.Marshal(EmailTaskPayload{UserID: 42, TemplateID: "welcome"}) task := asynq.NewTask(TypeEmailDelivery, payload, asynq.MaxRetry(5))

// Aufgabe in die Warteschlange stellen info, err := client.Enqueue(task, asynq.ProcessIn(10*time.Second)) // um 10 Sekunden verzögern if err != nil { log.Fatal(err) } log.Printf("Aufgabe eingereiht: ID=%s, Warteschlange=%s", info.ID, info.Queue)

// Server-Worker srv := asynq.NewServer( asynq.RedisClientOpt{Addr: "localhost:6379"}, asynq.Config{Concurrency: 10}, )

// Handler registrieren mux := asynq.NewServeMux() mux.HandleFunc(TypeEmailDelivery, HandleEmailTask)

// Worker starten if err := srv.Run(mux); err != nil { log.Fatal(err) }}


2. Machinery



Machinery ist eine der beliebtesten und ausgereiftesten Bibliotheken für Go. Sie unterstützt mehrere Broker: Redis, AMQP (RabbitMQ), AWS SQS, MongoDB und andere. Sie zeichnet sich durch umfangreiche Funktionalität und Flexibilität aus.



Hauptmerkmale:

  • Unterst

Empfehlungen