Módulo 4: Merge Avanzado y Fan-Out / Fan-In

Fan-Out Condicional

Descripción de la cápsula

Hasta acá el fan-out era incondicional — todas las ramas se ejecutan siempre. Pero a veces quieres ejecutar solo algunas ramas según el input: "si el lead es enterprise, llamar API premium; si es regular, solo Slack". Es fan-out condicional.

En esta cápsula vas a aprender los 3 patterns de fan-out condicional: con IF + ramas, con Switch + ramas convergentes, y combinación de ambos. Cada uno tiene su lugar.


Lo que vas a aprender

  • Implementar fan-out con activación condicional por rama
  • Diferenciar los 3 patterns
  • Combinar con Merge cuando las ramas vuelven a converger
  • Aplicar a casos reales

Pattern 1: IF + ramas paralelas

[Input]
   │
[IF: condición]
├─ TRUE → [rama A: hace cosas]
│          [rama B: otras cosas]
│
└─ FALSE → [rama C]

Si TRUE, ejecuta múltiples cosas en paralelo. Si FALSE, solo C.

Caso típico: "Si el lead es VIP, mandar email Y notificar Slack Y crear ticket en CRM. Si no es VIP, solo agregar a Sheet."


Pattern 2: Switch + ramas paralelas dentro de cada rama

[Input]
   │
[Switch: category]
├─→ "enterprise" → [rama A] [rama B] [rama C]
├─→ "smb"        → [rama D] [rama E]
└─→ "free"       → [rama F]

Cada salida del Switch puede tener fan-out propio. Las ramas dentro de una salida son paralelas; entre salidas son alternativas.


Pattern 3: Fan-out completo + convergencia condicional

[Input]
   │
   ├─→ [Set: aplicar a A]
   ├─→ [Set: aplicar a B]
   └─→ [Set: aplicar a C]
        │
        ▼
   [Merge: condicional]

Difícil — Merge no tiene "condicional" nativo. Workaround: cada rama produce items con flag, después Filter después del Merge.


Caso real: notificación según severidad

[Webhook: ticket]
   │
[Set: severity]
   │
[Switch: severity]
├─→ "critical" → [Slack]
│              + [SMS]
│              + [Email a oncall]
│              + [PagerDuty alert]
│
├─→ "high"     → [Slack]
│              + [Email a equipo]
│
├─→ "medium"   → [Slack]
│
└─→ "low"      → [Sheet: append cola]

Críticas notifican por 4 canales paralelos. Altas por 2. Medias 1. Bajas, log.


Trampas comunes

Trampa 1: Lógica duplicada entre ramas del Switch

Qué pasa: Las salidas "critica" y "alta" tienen 80% de las mismas ramas. Cambias algo, debes actualizar en 2 lados.

Cómo evitar:

  • Extraer la lógica común ANTES del Switch
  • Switch solo para lo que realmente difiere

Trampa 2: Fan-out sin pensar en idempotencia

Qué pasa: 4 ramas paralelas modifican el mismo CRM. Race conditions, updates perdidos.

Cómo evitar:

  • Una rama actualiza el CRM, otras notifican o leen
  • O usar locking si tu sistema lo soporta

Trampa 3: Demasiados puntos de salida

Qué pasa: Tu workflow tiene 8 destinos finales (Slack 1, Slack 2, Email A, Email B, Sheet X, Sheet Y, CRM, alert PD). Imposible ver el panorama.

Cómo evitar:

  • Agrupar destinos por tipo en sub-workflows
  • Convergir antes de los destinos para reducir el spaghetti

Resumen y siguiente paso

  • Fan-out condicional: ramas paralelas que se activan según condiciones
  • 3 patterns: IF + ramas, Switch con ramas paralelas por salida, fan-out + Merge condicional
  • Caso típico: notificación según severidad/categoría
  • 3 trampas: lógica duplicada, sin pensar idempotencia, demasiados destinos

Lo que sigue: Anti-patterns generales del módulo — qué evitar en cualquier diseño con paralelismo.


Creado: Mayo 11, 2026 Versión: 1.0