Motor de recurrencia y orquestación asíncrona de tareas
Buk, 2025 — De encuestas manuales y puntuales a automatización 100% recurrente con un motor de reglas reutilizable en toda la plataforma
Situación
En la plataforma SaaS de gestión de RR. HH. de Buk (con presencia en múltiples países de Latinoamérica y miles de usuarios concurrentes), el módulo de clima laboral requería automatizar la recolección continua de feedback. Hasta ese momento, las encuestas solo podían ejecutarse de forma puntual o manual, lo que limitaba la capacidad de las empresas para medir el pulso de sus equipos de forma periódica a lo largo del tiempo.
Tarea
Como champion/líder del proyecto, debía diseñar un motor de recurrencia desacoplado y reutilizable (capaz de manejar reglas complejas de repetición al estilo de Google Calendar) e implementar un sistema de orquestación de background jobs capaz de activar, reprogramar y procesar encuestas recurrentes sin generar inconsistencias de datos ni sobrecargar la infraestructura.
Acción
- Abstracción del dominio (motor de recurrencia): diseñé un componente
desacoplado y agnóstico del módulo de encuestas para calcular reglas de
repetición (
rrule, frecuencias, intervalos y excepciones), aislando la complejidad matemática del calendario y dejando la lógica disponible para otros módulos de la plataforma. - Modelado de datos para respuestas múltiples: rediseñé el modelo de datos para separar la definición/plantilla de la encuesta de sus instancias de ejecución, permitiendo que los colaboradores respondan N veces la misma encuesta en distintos periodos manteniendo el historial limpio.
- Orquestación asíncrona y ciclo de vida de los jobs: diseñé el despacho de future tasks en colas de trabajo en segundo plano para activar las encuestas en las fechas y horas exactas programadas, e implementé la gestión de su ciclo de vida para que, si un administrador edita o cancela una regla de recurrencia en vivo, el sistema cancele, recalcule y reordene dinámicamente las tareas futuras.
- Garantía de idempotencia: implementé controles de concurrencia para asegurar que cada instancia de encuesta o notificación masiva se genere exactamente una vez por periodo, incluso ante reintentos de la cola de jobs.
Compromisos de ingeniería (trade-offs)
- Motor de recurrencia desacoplado vs. solución ad hoc en el módulo: invertir en abstraer la lógica de repetición en un componente agnóstico, en lugar de programar fechas fijas dentro de la tabla de encuestas, asumió mayor complejidad de diseño inicial a cambio de cero duplicación de código futura y alta mantenibilidad.
- Programación dinámica de jobs vs. evaluación por lotes (cron diario): programar e iterar jobs asíncronos específicos para cada evento recurrente requirió lógica cuidadosa para invalidar y reorquestar tareas cuando el usuario edita la configuración, pero evitó crons pesados que escanearan cada noche toda la base de datos buscando encuestas pendientes.
Resultado
| Métrica | Estado inicial | Tras la implementación |
|---|---|---|
| Capacidad de programación | 100% manual / ejecuciones puntuales | 100% automatizado con reglas de recurrencia complejas |
| Reutilización de código | Lógica acoplada a un módulo específico | Motor de recurrencia centralizado y reutilizable en toda la plataforma |
| Procesamiento de tareas | Inexistente para eventos periódicos | Orquestación asíncrona idempotente con soporte para edición en vivo |
Se eliminó la carga operativa manual para los equipos de gestión de personas en cientos de empresas clientes, habilitando la medición continua del clima laboral y aumentando el engagement con el módulo.