Arquitectura¶
Estado verificado al 28 de marzo de 2026. Nota de runtime: FastFN resuelve dependencias y build por función según el runtime: Python usa
requirements.txt, Node usapackage.json, PHP instala desdecomposer.jsoncuando existe, y Rust compila handlers concargo. Enfastfn dev --nativenecesitas runtimes y herramientas del host, mientras quefastfn devdepende de un daemon de Docker activo.
Vista rápida¶
- Complejidad: Avanzada
- Tiempo típico: 20-35 minutos
- Úsala cuando: quieres entender dónde ocurren el ruteo, la cola, la selección de sockets y la ejecución del runtime
- Resultado: un modelo práctico para depurar salud, escalado y flujo de requests
Objetivos de diseño¶
FastFN mantiene la plataforma simple de tres maneras:
- un solo edge HTTP
- discovery guiado por filesystem
- control por función sin una capa grande de control central
Si solo recuerdas una idea, quedate con esta:
- tus archivos definen la app
- OpenResty decide que es publico
- los runtimes solo ejecutan los handlers que el discovery selecciona
Por eso OpenResty queda en el borde y los runtimes de lenguaje viven detrás de Unix sockets.
Modelo mental¶
flowchart LR
A["Cliente HTTP"] --> B["Gateway OpenResty"]
B --> C["Rutas y políticas"]
C --> D["Admisión del worker pool"]
D --> E["Selección de socket runtime"]
E --> F["Daemon Node / Python / PHP / Rust"]
F --> G["Handler de la función"]
G --> F
F --> B
B --> A
En modo Docker, la misma pila corre dentro del servicio openresty. En modo native, el CLI arranca OpenResty y los daemons directamente en el host.
Para una vista mas operativa, ver tambien:
Si el fn.config.json raíz declara assets, el gateway también puede servir una carpeta pública directamente desde / antes o después del worker según assets.run_worker_first.
Ese mount de assets es deliberadamente acotado: solo se publica la carpeta configurada. Las carpetas vecinas de funciones siguen privadas, y FastFN bloquea dotfiles, traversal y prefijos reservados como /_fn/* y /console/* antes de resolver archivos.
Discovery y mapa de rutas¶
FastFN no usa un routes.json estático como fuente de verdad. Descubre funciones desde un directorio y arma el mapa de rutas en runtime.
Formas comunes de definir el directorio de funciones:
fastfn dev functionsfastfn.json->"functions-dir": "functions"FN_FUNCTIONS_ROOT=/ruta/absoluta/a/functions
El orden de runtimes también se puede configurar:
FN_RUNTIMES=python,node,php,rust
Si la misma ruta pública existe en más de un runtime, gana el primer runtime habilitado, salvo que fuerces el takeover de forma explícita.
Cuando hay assets root-level:
run_worker_first=false: FastFN intenta asset real primero y luego cae a la ruta de función si no existe archivo.run_worker_first=true: FastFN intenta la ruta de función primero y solo usa assets como fallback.- En modo SPA, el fallback a
index.htmlocurre únicamente después de confirmar que no hubo asset real ni route handler.
En fastfn dev, las apps no-leaf se montan por el root completo del proyecto. Eso hace que el hot reload vea carpetas nuevas, archivos nuevos de assets y funciones nuevas sin reiniciar, y además evita degradar funciones explícitas root-level en aliases tipo handler.*.
Ruteo hacia runtimes¶
FastFN separa los runtimes en dos grupos:
luacorre dentro de OpenResty.node,python,php,rustygocorren detrás de Unix sockets.
En PHP, además, el daemon ya no carga todos los handlers dentro del mismo intérprete compartido. Mantiene un daemon socket-facing y workers hijos aislados por handler, así una función no redeclara ni inspecciona por accidente el símbolo global handler() de otra.
Cuando un runtime tiene un solo daemon, el gateway usa un socket. Cuando tiene varios daemons, el gateway mantiene una lista y elige un socket sano con round_robin.
Controles principales:
runtime-daemonsoFN_RUNTIME_DAEMONSpara definir countsFN_RUNTIME_SOCKETSpara pasar un mapa explícito de socketsFN_SOCKET_BASE_DIRpara la ubicación base de sockets generados
Reglas importantes:
FN_RUNTIME_SOCKETSgana sobre los counts generados.luaignora counts porque no corre como daemon externo.- La salud se sigue por socket, no solo por runtime.
/_fn/healthexpone tanto la salud agregada como la lista de sockets.
Controles de concurrencia: qué hace cada uno¶
FastFN tiene dos capas distintas de escalado y sirven para cosas diferentes.
| Control | Alcance | Dónde aplica | Qué hace |
|---|---|---|---|
runtime-daemons |
global por runtime | arranque | agrega más procesos y sockets para un runtime |
worker_pool.* |
por función | admisión y cola en gateway | limita ejecuciones activas y cola antes de llamar al runtime |
| internals del runtime | específico del runtime | dentro de cada daemon | workers hijos, reutilización de procesos, builds e instalaciones |
Lectura práctica:
- Usa
runtime-daemonscuando quieres más destinos reales para ese runtime. - Usa
worker_poolcuando quieres backpressure y control de cola por función. - Mide ambos con tráfico real; se complementan, no se reemplazan.
Elección de binarios¶
En modo native, FastFN puede elegir el ejecutable usado para cada runtime o herramienta mediante runtime-binaries o variables FN_*_BIN.
Ejemplos:
FN_PYTHON_BINFN_NODE_BINFN_PHP_BINFN_CARGO_BINFN_COMPOSER_BINFN_OPENRESTY_BIN
Detalle importante:
- FastFN elige un ejecutable por clave.
- Si corres tres daemons de Python, los tres usan el mismo
FN_PYTHON_BIN. - El routing multi-daemon no es un pool mixto de versiones.
Salud, failover y errores¶
El arranque y el flujo de requests están pensados para fallar de forma clara:
- El modo native verifica que el puerto del host esté libre antes de iniciar.
- Las rutas de socket se revisan antes del arranque y se eliminan sockets viejos.
- Los health checks corren por runtime y por socket.
- Si un socket cae, el gateway puede saltarlo y seguir usando los sanos.
- Si todos los sockets de un runtime están caídos, las requests fallan con
503 runtime unavailable.
Cuando include_debug_headers=true, las respuestas de función pueden incluir:
X-Fn-Runtime-RoutingX-Fn-Runtime-Socket-Index
Sirven para comprobar que el tráfico realmente rota entre sockets.
Tradeoffs¶
Este modelo es simple a propósito, pero no hace milagros:
- Más daemons pueden ayudar en runtimes bloqueados o CPU-bound, pero también pueden agregar overhead.
- La cola en el gateway mejora el control, no la velocidad bruta por sí sola.
- Unix sockets vuelven la pila local más predecible, pero siguen agregando un salto frente a Lua in-process.
Por eso FastFN publica artefactos crudos de benchmark y conviene medir tu propia carga antes de subir counts en todos los runtimes.
Enlaces relacionados¶
- Especificación de funciones
- Configuración global
- Referencia completa de config
- Referencia API HTTP
- Escalar daemons de runtime
- Ejecutar y probar
- Depuracion y troubleshooting
- Benchmarks de rendimiento