“12 Factor App”: aplicaciones exitosas SaaS

DESARROLLO WEB, CLOUD NATIVE.
12 Factor app

La metodología de doce factores (12 Factor) fue creada en el año 2012 por varios desarrolladores de aplicaciones en Heroku y consiste en un enfoque o filosofía de trabajo en la que se deben considerar doce principios para desarrollar aplicaciones en la nube (Cloud Computing Apps). A través de estos 12 puntos clave se facilita la construcción correcta y el desarrollo óptimo de un servicio en la nube.

Desde su creación, esta metodología ha evolucionado, y aún hoy podemos aprender valiosas lecciones de ella. El auge de Heroku, que permitió una nueva forma de escribir aplicaciones web y desplegar sistemas distribuidos, fue una encarnación de estas ideas.

En este artículo, re-examinaremos estas prácticas de desarrollo más de diez años después de la publicación del manifesto original, su evolución a lo largo del tiempo, su relevancia en la actualidad y su impacto en las prácticas de desarrollo de software.

12 Factor App- Una Metodología SaaS

12 Factor es principalmente un marco para construir aplicaciones de software como servicio – SaaS (Software as a Service) – en la nube. Para entender su enfoque y su aplicación es necesario conocer los tipos de soluciones cloud computing como IaaS, PaaS, SaaS.

  • Infrastructure as a Service (IaaS) - Infraestructura como servicio

Ofrece el acceso a infraestructura (servidores, redes, almacenamiento, balanceadores de carga, etc) con total control para el usuario. En este servicio están incluídos adicionalmente el almacenamiento y los firewalls.

Algunos ejemplos de IaaS son los servicios base de Amazon Web Services y Microsoft Azure.

  • Platform as a Service (PaaS) - Plataforma como servicio

Usando una plataforma administrada, podemos ejecutar aplicaciones bajo un entorno de infraestructura administrado. Significa que el usuario aprovecha entornos de ejecución proporcionados por un proveedor, sin tener control específico de la infraestructura subyacente. Algunos ejemplos de PaaS son OpenShift, Google App Engine, Heroku.

  • Software as a Service (SaaS) - Software como servicio

Es el escenario de mayor abstracción para el usuario. Se entrega un software completamente funcional, delegando la administración de plataforma e infraestructura a un proveedor.

El usuario adquiere el uso de una aplicación bajo demanda y no necesita realizar la instalación ni el mantenimiento.Algunos ejemplos de SaaS son Facebook, Gmail, Google Drive y Flickr.   

Las aplicaciones SaaS son en sí una industria con un gran potencial y los retos de desarrollar este tipo de aplicaciones son el enfoque de "12 Factor".

Los objetivos originales del "12 Factor"

Esta metodología se presentó a través de un manifiesto publicado en 13 idiomas, en el cual se explican los objetivos que busca cumplir "12 Factor":

  • Configuraciones automatizables y explícitas.

  • Dependencias claras con el entorno para máxima compatibilidad.

  • La aplicación debe ser desplegada en la nube.

  • Despliegue continuo.

  • Aplicaciones enfocadas en la escalabilidad.

Exploremos ahora sí los doce factores:

Group 2

Los 12 Factores 

I. Código base 

El código base se coloca en repositorios y los despliegues de las aplicaciones se realizan desde éste. Dependiendo de la complejidad de la aplicación, puede haber más de un repositorio, pero ningún código debe repetirse y todo el código y sus cambios deben estar protegidos dentro de un repositorio.

II. Dependencias

Si el código de nuestra aplicación depende de otro código como pueden ser librerías, módulos o paquetes, es necesario que las dependencias sean explícitas y en caso de que no existan en la aplicación, debe haber un sistema automático que las instale.

III. Configuraciones

El código no debe tener configuración dentro de sí mismo. Debe hacer referencia a las variables de configuración manejadas externamente y fácilmente administrables.

IV. Backing Services

Son aquellos recursos que se pueden conectar a la aplicación, sin importar si son locales o de terceros.

V. Construir, distribuir y ejecutar

Se deben separar la etapa de construcción y desarrollo de la etapa de ejecución.

VI. Procesos

La aplicación se ejecuta como uno o más procesos sin estado.

VII. Asignación de puertos

Los servicios son publicados mediante la asignación de puertos.

VIII. Concurrencia

Se utiliza el modelo de procesos como escalabilidad.

IX. Desechabilidad

Hacer el sistema más robusto intentando conseguir inicios rápidos y finalizaciones seguras.

X. Paridad en desarrollo y producción

El desarrollo, la pre-producción y la producción deben ser lo más similares entre sí como sea posible.

XI. Gestión de Logs

La gestión de logs debe ser tratada como una transmisión de eventos.

XII. Administración de procesos

Las tareas de gestión y administración deben ejecutarse como procesos que se ejecutan solamente una vez.

Puede consultar los factores en detalle en el sitio de 12 Factor App en español.

12 Factor App ¿sigue siendo relevante?

La metodología de los 12 factores sigue siendo muy pertinente hoy en día, sobre todo para crear aplicaciones nativas de la nube y basadas en microservicios. La adhesión a la metodología puede ayudar a integrar la seguridad, la fiabilidad y la resiliencia en sus aplicaciones. Además, los lenguajes de programación modernos, los marcos de desarrollo y la naturaleza agnóstica de la plataforma de microservicios facilitan la adopción de estos 12 factores.

12 Factor App y los  Microservicios

En nuestra página sobre Microservicios hemos destacado las ventajas de la arquitectura de microservicios en comparación con el enfoque monolítico en el desarrollo de aplicaciones. El uso de la metodología 12-Factor App puede ser una solución eficaz para la implementación de los Microservicios, aunque inicialmente fuera desarrollada por desarrolladores de Heroku, la metodología se basa en principios comunes compartidos por aplicaciones de éxito, y no está vinculada a ninguna tecnología o lenguaje de programación en particular. 

La metodología 12-Factor App resulta adecuada para transformar aplicaciones monolíticas en microservicios y para desarrollar aplicaciones nativas de la nube desde cero utilizando microservicios. Este artículo proporcionará una visión general de cómo utilizar la metodología 12-Factor App, con alguna información específica relativa a los microservicios.

Aplicando los 12 factores en el desarrollo web moderno

Aquí presentamos una tabla de los 12 factores y su relevancia en el desarrollo web moderno.  

12 Factores

Perspectiva Actual

I. Código base

Hoy en día, la relación entre los repositorios de código y las aplicaciones ha evolucionado significativamente, y todo, desde las pruebas hasta el despliegue, está integrado en el repositorio. Sin embargo, el uso de monorepos, o un único repositorio para todo un proyecto, sigue siendo un tema polémico. 

En un entorno centrado en microservicios, la gestión de múltiples repositorios puede llevar mucho tiempo y ser engorrosa, y adherirse a la metodología de los doce factores puede ayudar a aliviar parte de la sobrecarga asociada. El enfoque de los doce factores sugiere que si una aplicación consta de múltiples bases de código, no es una aplicación sino un sistema distribuido, y cada componente se considera una aplicación que puede adherirse de forma independiente a las directrices de los doce factores.

II. Dependencias

Antes de la llegada de herramientas como Ansible y Puppet, los sistemas de aprovisionamiento eran difíciles de gestionar debido a las peculiaridades del sistema operativo y a las distintas versiones de las bibliotecas. Sin embargo, el cuarto factor de la metodología de los doce factores abordaba esta cuestión, y ahora está resuelta en su mayor parte. En la arquitectura de los Microservicios las dependencias deben extraerse durante el proceso de compilación en lugar de empaquetarlas dentro de la aplicación de microservicio. Esto simplifica la configuración para los nuevos desarrolladores y proporciona coherencia en los entornos de desarrollo, preparación y producción.

III. Configuraciones

Externalizar la configuración del código de la aplicación  es crucial en el desarrollo de microservicios. La configuración debe estar separada del código de la aplicación para seguir el principio de "escribir una vez, configurar en todas partes". Las herramientas modernas como Vault o los sistemas de descubrimiento de servicios pueden gestionar y almacenar la configuración en sistemas conscientes del entorno. MicroProfile Config ofrece una solución al colocar la configuración en archivos de propiedades, lo que permite actualizaciones sencillas sin necesidad de recompilar los microservicios.

IV. Backing services

Originalmente, este factor se refería a los componentes de un sistema, especialmente las bases de datos. Ahora, se utiliza al crear una plataforma que otros utilizarán, con un enfoque que da prioridad a las API. Este enfoque ha tenido éxito, y muchos equipos lo han adoptado para promover la flexibilidad y la eficiencia a medida que crecen los sistemas.

V. Construir, distribuir y ejecutar

Este factor es más o menos un requisito previo para desarrollar software como servicio en 2022 (SaaS). Con el desarrollo de proveedores de SaaS con CI/CD como GitHub, ACR Tasks y Circle CI, ahora es sencillo automatizar este proceso.

En los microservicios, todo lo que está fuera de un servicio se considera un recurso adjunto. Esto hace que cada servicio sea portátil y esté separado de otros recursos del sistema, lo que aumenta la flexibilidad durante el desarrollo. Los desarrolladores solo necesitan ejecutar el servicio que están cambiando, no otros.

VI. Procesos

Este factor se centra en la necesidad de aplicaciones stateless, es crucial tanto en las API REST como en los microservicios. En las API REST, esto significa que no debe mantenerse ningún estado de dominio en memoria entre peticiones HTTP y que, en su lugar, debe transferirse a un servicio de caché, lo que permite la escalabilidad en un entorno de software como servicio. 

Del mismo modo, en el caso de los microservicios, la ausencia de estado permite el escalado horizontal mediante la adición de más instancias de servicio, mientras que cualquier dato con estado o compartido debe almacenarse en un servicio de respaldo.

VII. Asignación de puertos

El factor de asignación de puertos sigue siendo una práctica estándar. La clave es que cada aplicación debe tener una asignación de puertos específica. En el caso de los microservicios, se recomienda acceder únicamente a los datos persistentes de un servicio a través de su API para evitar el acoplamiento estrecho y los contratos de servicio implícitos. Esto también permite a los desarrolladores elegir el almacén de datos más adecuado para cada servicio, promoviendo el aislamiento de datos.

VIII. Concurrencia

Este factor es ya una práctica estándar en la industria.La escalabilidad horizontal es esencial para lograr un escalado significativo en plataformas SaaS. En los despliegues de Kubernetes, se puede ajustar fácilmente el número de pods para alcanzarla. Sin embargo, para este objetivo es crucial contar con una arquitectura de software adecuada y es importante identificar las aplicaciones que requieren un escalado significativo desde el principio. Twelve Factor App pretende promover la escalabilidad horizontal y romper con la era del escalado vertical. Aunque el paradigma sin servidor sigue predominando, las ineficiencias en el escalado pueden reducirse con ecosistemas de nueva generación como Go y Rust.

IX. Desechabilidad

Este factor sigue siendo relevante tal y como está escrito y sigue siendo casi tan difícil de alcanzar hoy como lo era hace diez años. Las comprobaciones de arranque y parada son importantes para mantener la funcionalidad de un sistema. Las comprobaciones de estado mantienen el sistema funcionando sin problemas, mientras que un fallo en el apagado adecuado puede afectar negativamente a otros sistemas y provocar una disminución de la fiabilidad y posibles problemas con los clientes.

X. Paridad en desarrollo y producción

Este factor se conoce coloquialmente como DevOps y sigue siendo tan relevante como siempre, pero todavía no se ha establecido plenamente en la SaaS. Puede resultar complicado replicar los entornos de producción en el portátil de un desarrollador, y los proveedores de nubes públicas no ofrecen suficiente soporte para los casos de uso de desarrollo. Kubernetes es la plataforma que más apoyo ofrece, y Kind es un excelente ejemplo de sus esfuerzos por crear un clúster Kubernetes multinodo fácil de usar para los desarrolladores utilizando únicamente Docker.

XI. Gestión de Logs

Inicialmente, los logs sólo se utilizaban como datos de salida de las aplicaciones, pero ahora es crucial que las aplicaciones realicen un seguimiento de los registros, las métricas y las trazas para mantener y comprender sus sistemas a medida que se amplían. 

Así pues, el factor de observabilidad de las aplicaciones debe actualizarse para indicar que las aplicaciones deben ser observables sin realizar ningún cambio en el sistema

XII. Administración de procesos

Este factor es común en los ecosistemas Rails y Drupal. Garantiza que el acceso a la base de datos utilice los mismos modelos que durante el tiempo de ejecución. Dos principios subyacen a este factor y se mantienen hoy en día: 

- Las herramientas de administración deben versionarse y publicarse con la misma disciplina que la aplicación. 

- El mantenimiento y las actualizaciones de la aplicación forman parte de su uso y deben tener puntos finales para uso administrativo interno.

En resumen, este factor se aplica tanto a las herramientas de la aplicación como a la propia aplicación.

Más allá de los 12 factores

Los doce factores descritos brindan orientación sobre cómo construir aplicaciones nativas de la nube, las cuales son fundamentales para cualquier empresa. Por lo general, una empresa tiene múltiples aplicaciones de este tipo desarrolladas por diferentes equipos en colaboración para proporcionar capacidades comerciales. 

Es importante establecer principios adicionales durante el ciclo de vida de desarrollo de la aplicación, en lugar de hacerlo como una ocurrencia tardía, para abordar la comunicación entre aplicaciones, así como la protección y control de acceso.

Las API’s

Las aplicaciones se comunican a través de las API y es importante considerar cómo se utilizará el ecosistema de la aplicación y diseñar una estrategia de API desde el principio. Una API bien diseñada aisla y separa las aplicaciones que consumen la infraestructura de la aplicación que proporciona el servicio. Esto permite cambiar el servicio subyacente y su infraestructura sin afectar a los consumidores de la aplicación. 

Seguridad

La seguridad es un tema importante y amplio que abarca muchos aspectos, como sistemas operativos, redes, firewalls, seguridad de datos y bases de datos, seguridad de aplicaciones y gestión de identidad y acceso.

Es esencial que la seguridad se tenga en cuenta al diseñar y construir una aplicación. Para proteger el acceso a la aplicación, es importante usar TLS para proteger los datos en tránsito y considerar el uso de autenticación mutua TLS para aplicaciones empresariales. 

Además, se recomienda usar listas de IP permitidas y denegadas para mejorar la seguridad del transporte y proteger los servicios contra ataques. También se debe agregar seguridad a nivel de la aplicación para controlar el acceso en función del consumidor, utilizando claves de API, autenticación y autorización basadas en certificados, intercambio de JSON Web Tokens (JWT) o Security Assertion Markup Language (SAML).

CONTÁCTENOS

Si su organización tiene interés en implementar proyectos de desarrollo de aplicaciones de la mano de expertos, lo invitamos a contactarnos.

También te puede interesar:También te puede interesar: