Twelve Factors App - Doce factores para Aplicaciones Web

En la actualidad se están desarrollando aplicaciones web que requieren ciertas características que antes no existian, ésto con el fin de asegurar escalabilidad y el funcionamiento adecuado en la nube. Desde hace algunos pocos años algunas personas que trabajan en proyectos como Heroku, desarrollaron un concepto llamado Twelve Factors, los cuales comprenden doce conceptos para crear aplicaciones.

Deseo explicar estos doce factores y exponer según mi percepción cómo se pueden implementar:

  1. Código base (Codebase): Un código base sobre el que hacer el control de versiones y multiples despliegues. Podemos utilizar un control de versiones como Git y utilizar algún servicio de hosting como Github o Gitlab, siendo Gitlab mi favorito.
  2. Dependencias: Declarar y aislar explicitamente las dependencias. Sin duda Docker garantiza esa isolación y la instalación de librerías inmutables.
  3. Configuraciones: Guardar la configuración en el entorno. Podemos utilizar variables de entorno para este fin, en linux sería básicamente un export mi_variable=mi_valor, en docker sería con la directiva ENV.
  4. Backing services: Tratar a los “backing services” como recursos conectables. Este término lo podemos relacionar con bases de datos como MariaDB, Mysql, Mongo o servicios de mensajería cómo Rabbit, Redis; servicios de Caché como MemCache o servicios SMTP como Postfix.
  5. Construir, desplegar, ejecutar: Separar completamente la etapa de construcción de la etapa de ejecución. Definitivamente aquí Docker también juega un papel super importante, podemos combinarlo con un sistema de integración continúa (CI) cómo Gitlab CI, Jenkings o Drone.
  6. Procesos: Ejecutar la aplicación como uno o más procesos sin estado. Normalmente utilizo Uwsgi para servir aplicaciones como procesos en lenguajes cómo Python, Perl, Ruby y hasta Javascript (con el motor V8).
  7. Asignación de puertos: Publicar servicios mediante asignación de puertos. Acá vale la pena recalcar la necesidad de tener estos puertos bien protegidos para servicios que no deben ser expuestos al mundo.
  8. Concurrencia: Escalar mediante el modelo de procesos. Idem. Uwsgi.
  9. Desechabilidad: Hacer el sistema más robusto intentando conseguir inicios rápidos y finalizaciones seguras. En este caso podemos utilizar un sistema de orquestación cómo Kubernetes, o para no ir muy lejos Supervisor.
  10. Paridad en desarrollo y producción: Mantener desarrollo, preproducción y producción tan parecidos como sea posible. Cuando utilizamos docker además de nuestro servicio de producción, también para el desarrollo garantizamos tener exactamente el mismo entorno, también podemos garantizar esto de una forma más fácil teniendo un archivo requirements bien definido y respetado por todos los desarrolladores.
  11. Historiales: Tratar los historiales como una transmisión de eventos. Basicamente acá hablamos de logs, podemos utilizar herramientas de los proveedores de hosting cómo StackDriver para GCP o servicios como ELK (Elasticsearch Logstash and Kibana) o TICK (Telegraft, InfluxDB and Kibana).
  12. Administración de procesos: Ejecutar las tareas de gestión/administración como procesos que solo se ejecutan una vez. Un ejemplo de esto sería la migración de bases de datos de Django con el comando python manage.py migrate, o con scripts que solamente realizan una tarea una sola vez.

Espero con esto aclarar el concepto de Twelve Factors, además de hacer notar que probablemente sin querer lo realizamos a menudo.

Juan Pablo Arias

I constantly discover new technologies and ways to improve IT processes. I'm a fan of automation. I like programming, but my passion is cloud computing.