Saltar a contenido

Control de Flujos

Guía para controlar los flujos de sincronización en producción.

Estados de un Flow

stateDiagram-v2
    [*] --> Running: Inicio
    Running --> Paused: POST /pause
    Paused --> Running: POST /resume
    Running --> Limited: POST /limit/N
    Limited --> Running: Alcanza límite
    Running --> Paused: Auto-pause (límite)
    Limited --> Paused: DELETE /limit + pause
Estado Descripción
Running Flow activo, ejecuta cada pollInterval
Paused Flow detenido, no ejecuta
Limited (N/M) Ejecuta N veces y se auto-pausa

Persistencia

El estado de pause se guarda en Redis:

# Ver flows pausados
redis-cli SMEMBERS sync:paused

# Pausar manualmente (antes de iniciar)
redis-cli SADD sync:paused articulos clientes pedidos

# Despausar manualmente
redis-cli SREM sync:paused articulos

Al reiniciar el servicio, carga el estado desde Redis.

Casos de Uso

Deploy Gradual

Para probar cambios en producción de forma controlada:

flowchart TD
    A[Deploy nuevo código] --> B[Pausar flow]
    B --> C[Test con 1 item]
    C --> D{¿OK?}
    D -->|No| E[Fix y redeploy]
    E --> C
    D -->|Sí| F[Habilitar con límite 5]
    F --> G[Monitorear 5 runs]
    G --> H{¿OK?}
    H -->|No| I[Pausar y debuggear]
    H -->|Sí| J[Quitar límite]
    J --> K[Flow en producción]

Comandos:

# 1. Pausar
curl -X POST http://localhost:8080/flow/articulos/pause

# 2. Test individual
curl -X POST http://localhost:8080/sync/articulos/ART001

# 3. Habilitar con límite
curl -X POST http://localhost:8080/flow/articulos/limit/5

# 4. Monitorear en dashboard
open http://localhost:8080/admin

# 5. Si OK, quitar límite
curl -X DELETE http://localhost:8080/flow/articulos/limit

Mantenimiento de Base de Datos

Pausar flows durante mantenimiento:

# Pausar todos
curl -X POST http://localhost:8080/flows/pause

# Hacer mantenimiento...

# Reanudar todos
curl -X POST http://localhost:8080/flows/resume

Debugging de Errores

Para investigar un error en un item específico:

# 1. Ver errores
curl http://localhost:8080/errors | jq

# 2. Borrar hash del item problemático
curl -X DELETE http://localhost:8080/reset/articulos/ART001

# 3. Sync solo ese item
curl -X POST http://localhost:8080/sync/articulos/ART001

# 4. Ver logs
docker logs rodamar_sync | grep ART001

Re-sincronización Completa

Para forzar re-sync de todo un flow:

# Opción 1: Resync (borra cache + sync inmediato)
curl -X POST http://localhost:8080/resync/articulos

# Opción 2: Reset + próximo poll
curl -X DELETE http://localhost:8080/reset/articulos
# Esperar al próximo pollInterval

Límites de Ejecución

¿Para qué sirven?

  • Testing controlado: Ejecutar N veces y parar
  • Rollout gradual: Probar con pocas ejecuciones
  • Depuración: Ver comportamiento sin loop infinito

Funcionamiento

sequenceDiagram
    participant API
    participant Poller
    participant Redis

    API->>Poller: setLimit("articulos", 3)
    Note over Poller: runCount = 0, runLimit = 3

    loop Cada pollInterval
        Poller->>Poller: pollFlow()
        Poller->>Poller: runCount++

        alt runCount >= runLimit
            Poller->>Redis: SADD sync:paused articulos
            Note over Poller: Flow auto-pausado
        end
    end

Ejemplo

# Establecer límite de 3 ejecuciones
curl -X POST http://localhost:8080/flow/articulos/limit/3

# Ver estado
curl http://localhost:8080/flows/status | jq '.articulos'
# {"paused": false, "runLimit": 3, "runCount": 0}

# Después de 3 ejecuciones:
# {"paused": true, "runLimit": 3, "runCount": 3}

Monitoreo

Dashboard

Ver estado en tiempo real en /admin:

  • Columna "Status": Running / Paused / N/M
  • Botones de control por flow
  • Activity log con acciones

API

# Estado de todos los flows
curl http://localhost:8080/flows/status

# Métricas
curl http://localhost:8080/metrics

# Errores
curl http://localhost:8080/errors

Logs

# Ver logs del container
docker logs -f rodamar_sync

# Filtrar por flow
docker logs rodamar_sync 2>&1 | grep '"flow":"articulos"'

# Ver solo errores
docker logs rodamar_sync 2>&1 | grep '"level":50'

Scripts Útiles

Pausar todo al iniciar

En .env:

START_PAUSED=true

O manualmente antes de iniciar:

redis-cli SADD sync:paused articulos clientes pedidos ...

Script de deploy

#!/bin/bash
# deploy.sh

# Pausar todos los flows
curl -X POST http://localhost:8080/flows/pause

# Actualizar imagen
docker pull mundoit/erp-wms-sync:latest
docker rm -f rodamar_sync
./update-sync.sh

# Esperar que inicie
sleep 5

# Verificar health
curl http://localhost:8080/health

# Reanudar flows gradualmente
for flow in provincias zonas transportes; do
  curl -X POST http://localhost:8080/flow/$flow/resume
  sleep 2
done

# Flows críticos con límite
for flow in articulos clientes pedidos; do
  curl -X POST http://localhost:8080/flow/$flow/limit/5
done

echo "Deploy completado. Flows críticos con límite de 5 runs."
echo "Monitorear en http://localhost:8080/admin"

Troubleshooting

Flow no se despausa

# Verificar Redis
redis-cli SMEMBERS sync:paused

# Forzar despausar
redis-cli SREM sync:paused articulos

# Reiniciar poller (opcional)
curl -X POST http://localhost:8080/flow/articulos/resume

Límite no funciona

El límite se resetea si se reinicia el servicio. Solo el estado de pause persiste.

Flow pausado pero sigue ejecutando

El pause solo afecta al próximo ciclo. Si hay un poll en progreso, termina.

# Ver si hay poll en progreso
docker logs rodamar_sync | tail -20 | grep "Poll completed"