Colas de tareas para Go (Golang): guía completa de bibliotecas y herramientas
En el mundo del desarrollo moderno con Go (Golang), el procesamiento de tareas en segundo plano y operaciones asíncronas es una tarea críticamente importante. Ya sea el envío de correos electrónicos, la generación de informes, el procesamiento de imágenes o la interacción con APIs externas, las colas de tareas (task queues) permiten descargar el flujo principal de la aplicación y aumentar su tolerancia a fallos. En este artículo, revisaremos las mejores bibliotecas para trabajar con colas en Go, sus características y ejemplos de uso.
¿Qué es una cola de tareas y para qué sirve?
Una cola de tareas es un mecanismo que permite posponer la ejecución de operaciones que consumen muchos recursos o son largas en segundo plano. Las principales ventajas son:
- Asincronía: el usuario no espera a que finalice una operación pesada.
- Escalabilidad: puede ejecutar múltiples workers para el procesamiento paralelo.
- Tolerancia a fallos: si un worker falla, la tarea permanece en la cola y será ejecutada por otro.
- Planificación: ejecución retrasada de tareas (por ejemplo, dentro de 1 hora).
Top 3 bibliotecas para colas de tareas en Go
1. Asynq
Asynq es una biblioteca moderna, de alto rendimiento y fácil de usar para colas de tareas distribuidas, construida sobre Redis. Fue desarrollada por el equipo de Google y es mantenida activamente por la comunidad.
Características clave:
- Funciona sobre Redis (se recomienda la versión 6.0+).
- Soporte para tareas retrasadas (scheduled tasks).
- Interfaz web integrada para monitoreo (Asynqmon).
- Cola de mensajes fallidos (dead-letter queue) para tareas fallidas.
- Grupos de tareas (task groups) para agrupación lógica.
- Reintentos con política de reintentos configurable.
Ejemplo de uso:
package main
import ( "context" "fmt" "log" "time"
"github.com/hibiken/asynq")
// Definimos el tipo de tareaconst TypeEmailDelivery = "email:deliver"
// Estructura de datos para la tareatype EmailTaskPayload struct { UserID int TemplateID string}
// Manejador de tareafunc 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("Enviando correo al usuario %d con la plantilla %s", payload.UserID, payload.TemplateID) // Aquí la lógica de envío de correo return nil}
func main() { // Cliente para encolar tareas client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) defer client.Close()
// Creamos una tarea payload, _ := json.Marshal(EmailTaskPayload{UserID: 42, TemplateID: "welcome"}) task := asynq.NewTask(TypeEmailDelivery, payload, asynq.MaxRetry(5))
// Encolamos la tarea info, err := client.Enqueue(task, asynq.ProcessIn(10*time.Second)) // retrasar 10 seg if err != nil { log.Fatal(err) } log.Printf("Tarea encolada: ID=%s, Cola=%s", info.ID, info.Queue)
// Servidor worker srv := asynq.NewServer( asynq.RedisClientOpt{Addr: "localhost:6379"}, asynq.Config{Concurrency: 10}, )
// Registramos el manejador mux := asynq.NewServeMux() mux.HandleFunc(TypeEmailDelivery, HandleEmailTask)
// Iniciamos el worker if err := srv.Run(mux); err != nil { log.Fatal(err) }}2. Machinery
Machinery es una de las bibliotecas más populares y maduras para Go. Soporta múltiples brokers: Redis, AMQP (RabbitMQ), AWS SQS, MongoDB y otros. Se distingue por su rica funcionalidad y flexibilidad.
Características clave:
- Soporte