08. VII. Asignación de puertos
08. VII. Asignación de puertos
Exporta servicios vía asignación de puertos (port binding).
Autocontención frente al modelo tradicional
Muchas aplicaciones tradicionales dependen de un servidor web externo (Apache, Tomcat) instalado y configurado en el host, dentro del cual la app corre como un módulo. Una aplicación twelve-factor no depende de eso: es completamente autocontenida.
La app incorpora, como dependencia declarada (Factor II), la librería que le permite hablar HTTP directamente:
- Python: Tornado, Gunicorn.
- Ruby: Thin, Puma.
- Java: Jetty embebido.
- Node.js: el propio runtime ya sirve HTTP.
Cómo funciona en la práctica
La aplicación exporta HTTP como un servicio asignado a un puerto, y escucha las peticiones que llegan a ese puerto:
# Desarrollo
http://localhost:5000/
# Producción: una capa de enrutamiento (reverse proxy, load balancer)
# recibe el tráfico público y lo redirige al puerto interno del proceso
No hay “instalar la app dentro de Apache”. El binario/proceso de la app es el servidor.
Una app puede ser el backing service de otra
El port binding no está limitado a HTTP. Otros protocolos también se exponen así: ejabberd (XMPP), Redis (su propio protocolo binario). Esto tiene una consecuencia directa: una aplicación que expone un puerto puede convertirse en el backing service (Factor IV) de otra aplicación, simplemente publicando su URL como una variable de configuración que la app consumidora usa para conectarse.
flowchart LR
AppA["App A<br/>(expone :8080)"] -->|URL en config| AppB["App B<br/>(consume App A como backing service)"]
Checklist del factor VII
- La aplicación no requiere un servidor web/aplicación externo instalado en el host para funcionar.
- El binding a un puerto está resuelto por una librería declarada como dependencia, no por infraestructura externa asumida.
- En producción, una capa de enrutamiento reenvía tráfico público hacia el puerto interno de cada proceso.
- Si esta app expone un servicio consumido por otra app, esa otra app la trata como backing service vía URL en su configuración.
Ya la app puede exponerse hacia afuera. Ahora toca ver cómo escala hacia adentro: el factor de concurrencia.