The twelve-factor app
by Victor Aguilar - @vicobits
Victor Aguilar C.
Fullstack developer
android / python / javascript
victor@xiberty.com
SAAS
Software as a service
Es una forma de distribución de software
- El mantenimiento lo realizan los desarrolladores
- Los clientes acceden al servicio por internet.
SAAS POPULARES
Tipos de escalamiento
- Vertical
- Horizontal
12F App
Es una metodología para el desarrollo de aplicaciones SAAS
http://12factor.net/
escrito por Adam Wiggins en 2011
1. Código base
- Código base = repo
- Usar algún sistema de control de versiones
-
Un solo repo, muchos despliegues.
- Una app no puede estar contenida en mucho repos
-
En código compartido debe ser externalizado
- Este debe ser fácil de instalar desde los gestores de paquetes como pip, ruby gems, npm, etc
Production
Test
Developer 1
Developer 2
2. Dependencias
Declarar y aislar explícitamente las dependencias
- Declarar las dependencias en un manifiesto
- Usan herramientas de aislamiento
- Declarar las versiones de las dependencias explícitamente
- No suponer que existen herramientas ya instaladas
Ejemplo
DEPENDENCIAS
$ virtualenv env
$ source env/bin/activate
$ (env) pip install requirements.txt
Manifiesto para las dependencias
Herramienta de aislamiento
requirements.txt
django==1.9.6
djangorestframework==3.3.3
markdown==2.6.6
{
3. Configuración
La configuración es la información necesaria para desplegar el código base
Nunca guardar información sensible en el código
Bases de datos
Credenciales
Direcciones, urls, etc
3. Configuración
Archivo de configuración
Variables de entorno
- Puede versionarse por equivocación
- Facil de manejar
- Trabajo extra
- Más seguro
- No se puede versionar
- Es un estándar en cualquier OS
GOOD
GOOD
BAD
BAD
GOOD
GOOD
RECOMENDADO
4. Servicios
Tratar a los servicios de tratados como recursos adjuntos
¿Cuales son?
Bases de datos
Servidores de correo
Cache
Otro servicio
Sin distinción entre servicios locales o de terceros
4. Servicios de terceros
Production deploy
Postgres
Mailgun / postfix
Redis
Amazon S3
5. Preparación, Lanzamiento
y ejecución.
- Clara separación entre estas 3 etapas
- El código no cambia en tiempo de ejecución
- Cada lanzamiento debe tener un ID
Preparación
Lanzamiento
Ejecución
- Código base
- Dependencias
- Estáticos
- Preparación
- Configuración
- Lanzamiento
- Proceso que lo ejecuta
6. Procesos
- Un proceso ejecutara el ultimo lanzamiento
- El proceso no debe requerir información temporal
- Las transacciones se hacen en el cache.
- No generar archivos estáticos en tiempo de ejecución
7. Puertos
La ejecución del ultimo lanzamiento:
- Puede estar vinculado a un puerto para resolver las peticiones
- Puede convertirse en un servicio para otras aplicaciones
Aplicación de reservas
Aplicación de catalogos
https://196.168.1.10:5555
https://196.168.1.10:8850
8. Concurrencia
- Escalar mediante el modelo de procesos
- Tipos procesos tienen tipos de trabajo
- Los procesos no deben ejecutarse como demonios aislados ni escribir archivos PID
- Utilizar un sistema para manejar procesos
El escalamiento deberá ser horizontal
WEB 1
WEB 1
WORKER 1
WORKER 2
WORKER 3
DB 1
CONCURRENCIA
$ supervisorctl update
$ supervisorctl start test_project
$ supervisorctl stop test_project
Configuración
Administración
sudo nano /etc/supervisor/conf.d/site.conf
[program:test_project]
command = /apps/test_project/start.sh
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
{
Manejador de procesos supervisor
Instalación
sudo apt-get install supervisor
9. Indisponibilidad
Los procesos son desechables
- Lograr inicios rápidos
- Lograr cierres seguros
- El trabajo actual se guarda en una cola de trabajos
- Todas las tareas son reentrantes
- Robustez ante la muerte súbita
10. Igualdad entre desarrollo y
Los entornos de desarrollo, producción, pruebas deben ser lo más similares posible.
producción
10. Entornos similares
Diferencias comunes entre entornos:
-
Tiempo
- Cuando el código tarda mucho para llegar a producción
-
Personal
- Cuando Los que despliegan la aplicación son diferentes personas que los que la desarrollaron
-
Herramientas
- Cuando se usan diferentes pilas de herramientas en desarrollo y producción
INTEGRACION CONTINUA
QUE LOS DESARROLLADORES DESPLIEGUEN
USAR EL MISMO STACK EN TODOS LOS ENTORNOS
Desarrollo
Producción
- SQLite
- FileBased Cache
- Woosh
- PostgreSQL
- Memcached
- Elastic search
LA TENTACIÓN MÁS COMÚN
DEBEMOS RESISTIRNOS A HACER ESTO
11. Historiales
Tratar a los historiales como una transmisión de eventos
No guardar los historiales en la base de datos
Capturar los historiales y redirigirlo a un servicio local o de terceros
12. Administración de procesos
Hay procesos que solo necesitamos ejecutarlos una vez, procesos como:
- Migraciones en la base de datos
- Abrir una consola con dependencias
- Scripts de una sola vez
Estos procesos deben estar en el código base
Ejemplo
ADMINISTRACION DE PROCESOS
$ python manage.py makemigrations
$ python manage.py migrate
En django
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py makemigrations
$ python manage.py migrate
Recapitulación
1. Código base
2. Dependencias
3. Configuración
4. Servicios
5. Preparación lanzamiento y ejecución
6. Procesos
7. Puertos
8. Concurrencia
9. Indisponibilidad
10. Igualdad entre desarrollo y producción
11. Historiales
12. Administración de procesos
Muchas gracias
victor@xiberty.com
Aplicaciones SOA con la Metología 12Factor App
By Victor Aguilar
Aplicaciones SOA con la Metología 12Factor App
Twelve factor app
- 339