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

Facebook

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