🧩 Caso 11: 💧 Elixir → 🌉 n8n → 🔴 Erlang (Cowboy) + Mnesia#
Demuestra el modelo de concurrencia por actores sobre la BEAM VM — un paradigma que ningún caso 01–09 cubre. Emisor Elixir y receptor Erlang/Cowboy con persistencia en Mnesia, la única BD de la matriz que vive dentro del runtime de la aplicación (sin contenedor de base de datos separado).
🏗️ Arquitectura del Flujo#
- 📤 Origen —
origin/lib/publisher.ex: emisor Elixir que leeposts.jsony reenvía los posts vencidos al webhook de n8n (HTTP vía:httpc, JSON vía el módulo:jsonde OTP 27, sin dependencias externas). - 🌉 Puente — n8n: guardrails canónicos (fingerprint → circuit breaker → idempotencia → HTTP con reintentos → DLQ).
- 📥 Destino —
dest/src/*.erl: aplicación Erlang/Cowboy 2.12 con árbol de supervisión OTP. Expone el contrato REST (/webhook,/errors,/logs,/health,/). - 📁 Persistencia — Mnesia (
ram_copies): tablasocial_postcomoordered_set, embebida en el nodo BEAM.
Nota
El destino se empaqueta como un release OTP con ERTS embebido (
rebar3 as prod release), el formato de despliegue idiomático de Erlang.
🚀 Cómo levantarlo#
bash
docker-compose --profile case11 up -d # sólo el receptor BEAM; no hay contenedor de BD| Servicio | Rol | Puerto host |
|---|---|---|
dest-erlang-11 | Erlang/Cowboy + Mnesia + dashboard | 8091 |
- Dashboard del caso: http://localhost:8091
- Probar desde el dashboard maestro: http://localhost:8080 → tarjeta CASE-11.
Probar el emisor Elixir (opcional)#
bash
cd cases/11-elixir-to-erlang/origin
WEBHOOK_URL=http://localhost:5678/webhook/social-bot-scheduler-beam mix run -e "Case11.Publisher.main()"🎯 Objetivos didácticos#
- Modelo de actores: cada request = un proceso BEAM ligero (~2 KB), aislado.
- "Let it crash" + supervisión OTP: el árbol de supervisión mantiene la app viva.
- Mnesia: la única BD de la matriz embebida en el runtime; transacciones ACID sin servidor externo.
⚠️ Consideraciones (modelo del laboratorio)#
- Puerto bindeado a
127.0.0.1(aislamiento runtime). - El receptor valida el payload (
idytext→ HTTP 422) como defensa en profundidad. ram_copiesmantiene los datos en memoria del nodo; en un clúster real se usaríadisc_copiescon replicación entre nodos.
✅ Estado#
Implementado y verificado (build + boot + health). Parte del Lote 1 del roadmap v5.0 → v4.5.