Files d'attente de tâches en Go (Golang) : meilleures bibliothèques et outils

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Files d'attente de tâches pour Go (Golang) : guide complet des bibliothèques et outils



Dans le monde du développement moderne en Go (Golang), le traitement des tâches d'arrière-plan et des opérations asynchrones est une tâche cruciale. Qu'il s'agisse d'envoyer des e-mails, de générer des rapports, de traiter des images ou d'interagir avec des API externes, les files d'attente de tâches (task queues) permettent de décharger le flux principal de l'application et d'améliorer sa tolérance aux pannes. Dans cet article, nous examinerons les meilleures bibliothèques pour travailler avec les files d'attente en Go, leurs caractéristiques et des exemples d'utilisation.



Qu'est-ce qu'une file d'attente de tâches et pourquoi en a-t-on besoin ?



Une file d'attente de tâches est un mécanisme qui permet de reporter l'exécution d'opérations gourmandes en ressources ou longues en arrière-plan. Principaux avantages :

  • Asynchronisme : l'utilisateur n'attend pas la fin de l'opération lourde.
  • Mise à l'échelle : vous pouvez lancer de nombreux workers pour un traitement parallèle.
  • Tolérance aux pannes : si un worker tombe, la tâche reste dans la file et sera exécutée par un autre.
  • Planification : exécution différée des tâches (par exemple, dans 1 heure).


Top 3 des bibliothèques pour les files d'attente de tâches en Go



1. Asynq



Asynq est une bibliothèque moderne, performante et facile à utiliser pour les files d'attente de tâches distribuées, construite sur Redis. Développée par l'équipe Google et activement maintenue par la communauté.



Caractéristiques clés :

  • Fonctionne sur Redis (version 6.0+ recommandée).
  • Prise en charge des tâches différées (scheduled tasks).
  • Interface web intégrée pour la surveillance (Asynqmon).
  • File d'attente Dead-letter pour les tâches échouées.
  • Groupes de tâches (task groups) pour un regroupement logique.
  • Retry avec politique de tentatives personnalisable.


Exemple d'utilisation :



package main

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

"github.com/hibiken/asynq")

// Définition du type de tâcheconst TypeEmailDelivery = "email:deliver"

// Structure de données pour la tâchetype EmailTaskPayload struct { UserID int TemplateID string}

// Gestionnaire de tâchefunc 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("Envoi d'un e-mail à l'utilisateur %d avec le modèle %s", payload.UserID, payload.TemplateID) // Logique d'envoi d'e-mail ici return nil}

func main() { // Client pour placer les tâches client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) defer client.Close()

// Création d'une tâche payload, _ := json.Marshal(EmailTaskPayload{UserID: 42, TemplateID: "welcome"}) task := asynq.NewTask(TypeEmailDelivery, payload, asynq.MaxRetry(5))

// Placement de la tâche dans la file info, err := client.Enqueue(task, asynq.ProcessIn(10*time.Second)) // différer de 10 sec if err != nil { log.Fatal(err) } log.Printf("Tâche mise en file : ID=%s, File=%s", info.ID, info.Queue)

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

// Enregistrement du gestionnaire mux := asynq.NewServeMux() mux.HandleFunc(TypeEmailDelivery, HandleEmailTask)

// Lancement du worker if err := srv.Run(mux); err != nil { log.Fatal(err) }}


2. Machinery



Machinery est l'une des bibliothèques les plus populaires et les plus matures pour Go. Prend en charge plusieurs courtiers : Redis, AMQP (RabbitMQ), AWS SQS, MongoDB et autres. Elle se distingue par sa richesse fonctionnelle et sa flexibilité.



Caractéristiques clés :

  • Prise en charge de plusieurs courtiers.
  • Planification des tâches.
  • Nouveaux essais automatiques.
  • Groupes de tâches et chaînes.
  • Surveillance via l'interface web.


Exemple d'utilisation :



package main

import ( "fmt" "github.com/RichardKnox/machinery/v1" "github.com/RichardKnox/machinery/v1/config" "github.com/RichardKnox/machinery/v1/tasks")

func main() { // Configuration du courtier cnf := &config.Config{ Broker: "redis://localhost:6379", DefaultQueue: "machinery_tasks", ResultBackend: "redis://localhost:6379", }

// Création du serveur server, err := machinery.NewServer(cnf) if err != nil { fmt.Println(err) return }

// Enregistrement de la tâche err = server.RegisterTask("send_email", SendEmail) if err != nil { fmt.Println(err) return }

// Lancement du worker worker := server.NewWorker("worker1", 10) err = worker.Launch() if err != nil { fmt.Println(err) }}

func SendEmail(userID int, templateID string) error { fmt.Printf("Envoi d'un e-mail à l'utilisateur %d avec le modèle %s", userID, templateID) return nil}


3. Gocraft/work



Gocraft/work est une bibliothèque légère et rapide pour les files d'attente de tâches utilisant Redis. Idéale pour les projets nécessitant une solution simple et fiable sans fonctionnalités superflues.



Caractéristiques clés :

  • Facilité d'utilisation et d'intégration.
  • Haute performance.
  • Prise en charge des tâches différées.
  • Nouveaux essais automatiques.
  • Surveillance via l'interface web.


Exemple d'utilisation :



package main

import ( "fmt" "github.com/gocraft/work" "github.com/gomodule/redigo/redis")

// Définition du contextetype Context struct{ CustomerID int64}

// Fonction de nettoyagefunc (c *Context) Log(job *work.Job, next work.NextMiddlewareFunc) error { fmt.Println("Début de la tâche :", job.Name) return next()}

// Fonction de la tâchefunc (c *Context) SendEmail(job *work.Job) error { userID := job.ArgInt64("user_id") templateID := job.ArgString("template_id") fmt.Printf("Envoi d'un e-mail à l'utilisateur %d avec le modèle %s", userID, templateID) return nil}

func main() { // Connexion à Redis pool := &redis.Pool{ MaxActive: 10, MaxIdle: 5, Dial: func() (redis.Conn, error) { return redis.Dial("tcp", "localhost:6379") }, }

// Création du client client := work.NewClient("my_app_namespace", pool)

// Mise en file d'une tâche _, err := client.Enqueue("send_email", work.Q{"user_id": 42, "template_id": "welcome"}) if err != nil { fmt.Println(err) return }

// Création du worker worker := work.NewWorkerPool(&Context{}, 10, "my_app_namespace", pool) worker.Middleware((*Context).Log) worker.Job("send_email", (*Context).SendEmail)

// Lancement du worker worker.Start() select {}}


Comparaison des bibliothèques



Caractéristique Asynq Machinery Gocraft/work
Courtier Redis Redis, AMQP, SQS, MongoDB Redis
Interface web Oui (Asynqmon) Oui Oui
Tâches différées Oui Oui Oui
Groupes de tâches Oui Oui Non
Chaînes de tâches Non Oui Non
Dead-letter queue Oui Oui Non
Performance Élevée Moyenne Élevée
Facilité d'utilisation Élevée Moyenne Élevée


Comment choisir la bonne bibliothèque ?



Le choix de la bibliothèque dépend de vos besoins :

  • Asynq est idéal si vous utilisez déjà Redis et avez besoin d'une solution moderne avec un riche ensemble de fonctionnalités et une interface web pratique.
  • Machinery convient aux projets nécessitant la prise en charge de plusieurs courtiers et une flexibilité maximale.
  • Gocraft/work est parfait pour les petites et moyennes applications où la simplicité et la performance sont importantes.


Conclusion



Les files d'attente de tâches sont un outil puissant pour créer des applications Go évolutives et tolérantes aux pannes. Asynq, Machinery et Gocraft/work sont trois excellentes bibliothèques qui couvrent la plupart des besoins des développeurs. Le choix dépend de vos exigences spécifiques en matière de fonctionnalités, de performance et de simplicité d'utilisation.



Quelle que soit la bibliothèque que vous choisissez, l'utilisation de files d'attente de tâches vous permettra de créer des applications plus fiables et efficaces capables de gérer de grandes charges de travail et de fournir une meilleure expérience utilisateur.

Recommendations