Tenemos muchas aplicaciones y servicios web (algunos productos públicos, algunos internos y parte de un "backend" privado) que son interdependientes entre sí. Cada uno de estos componentes tiene 4 entornos (grupos de servidores / nodos que sirven para propósitos específicos):
- No producción
DEV- Entorno de desarrollo integrado donde CI crea cambios de empuje; útil para que los ingenieros resuelvan errores difíciles de encontrar que no son reproducibles localmenteQA- QA aislado / entorno de pruebaDEMO- Entorno UAT estable para las partes interesadas del negocio.
- Producción
LIVE- Nuestro entorno de producción / vida
La promoción del código va: LOCAL(máquina del desarrollador) => DEV=> QA=> DEMO=> LIVE.
Digamos que tenemos una aplicación llamada myappque está respaldada por un servicio web RESTful llamado myws, que a su vez está respaldado por un DB llamado mydb.
Actualmente, tenemos lo que yo llamaría promoción " orquestada " entre estas dependencias: los myapp-devpuntos a los myws-devque se usa mydb-dev. Del mismo modo, myapp-qaseñala a myws-qaqué usos mydb-qa. Lo mismo para DEMOy LIVE.
El problema con esto es que cada vez que hago un cambio a, por ejemplo, myappesto me obliga a realizar cambios mywsy mydbasí. Pero debido a que cada DEVentorno apunta a los entornos de sus dependencias DEV, significa que tengo que programar y desplegar estos cambios al mismo tiempo. Además, si una compilación se vuelve inestable / rota, a menudo derriba otros componentes ascendentes; por ejemplo, si un desarrollador rompe algo al cambiar mydb-dev, los clústeres myws-devy myapp-devgeneralmente también se vuelven inestables.
Para resolver esto, estoy elaborando una propuesta para lo que yo llamaría una estrategia de promoción " aislada ": todas las dependencias entre componentes siguen esta guía:
- Las dependencias ascendentes dependen del
DEMOentorno para sus dependencias descendentes, para todos sus entornos no productivos (DEV,QAyDEMO); y - Las dependencias ascendentes dependen del
LIVEentorno para sus dependencias descendentes para su entorno de producción
Usando esta convención, myapp-devapuntaría a myws-demo, cuál usaría mydb-demo. Del mismo modo, myapp-qatambién apuntaría a myws-demoy mydb-demo.
La ventaja aquí que puedo encontrar es la estabilización de construcción : es mucho menos probable que el DEMOambiente para un componente en particular se volverá inestable, ya que el código no puede llegar a DEMOsin pruebas rigurosas tanto en DEVy QA.
La única desventaja que puedo encontrar con este método es que, si DEMOse rompe para un componente en particular, todos los entornos de no producción para todas las dependencias ascendentes se romperán repentinamente. Pero respondería que esto debería ocurrir extremadamente raramente debido a las pruebas realizadas en DEVy QA.
Esto ha llegado a ser un problema que muchos desarrolladores (mucho más inteligente y con experiencia que yo mismo) han resuelto, y no me sorprendería si este problema y sus soluciones ya tienen nombres a ellos (además de lo que denomino orquestada / silos). Entonces, pregunto: ¿los méritos de una estrategia de promoción aislada superan los inconvenientes, y cuáles son los inconvenientes que puedo estar pasando por alto aquí?