Mamy wiele aplikacji i usług internetowych (niektóre produkty publiczne, niektóre wewnętrzne i część prywatnego „zaplecza”), które są od siebie zależne. Każdy z tych komponentów ma 4 środowiska (klastry serwerów / węzłów służące do określonych celów):
- Nieprodukcyjny
DEV
- Zintegrowane środowisko programistyczne, w którym CI buduje zmiany push; przydatne dla inżynierów w rozwiązywaniu trudnych do znalezienia błędów, które nie są lokalnie odtwarzalneQA
- Izolowane środowisko kontroli jakości / testowaniaDEMO
- Stabilne środowisko UAT dla interesariuszy biznesowych
- Produkcja
LIVE
- Nasze środowisko na żywo / produkcyjne
Promocja kodu idzie: LOCAL
(maszyna programisty) => DEV
=> QA
=> DEMO
=> LIVE
.
Załóżmy, że mamy wywoływaną aplikację, myapp
która jest wspierana przez usługę RESTful o nazwie Web myws
, która sama jest wspierana przez DB o nazwie mydb
.
Obecnie wśród tych zależności mamy coś, co nazwałbym „ zorganizowaną ” promocją: myapp-dev
punkty, do myws-dev
których wykorzystuje mydb-dev
. Podobnie myapp-qa
punkty, do myws-qa
których wykorzystuje mydb-qa
. To samo dotyczy DEMO
i LIVE
.
Problem polega na tym, że w każdej chwili dokonać zmiany, powiedzmy, myapp
wymaga to mnie do wprowadzania zmian myws
i mydb
jak dobrze. Ponieważ jednak każde DEV
środowisko wskazuje środowiska zależności DEV
, oznacza to, że muszę planować i wdrażać te zmiany jednocześnie. Ponadto, jeśli jedna kompilacja staje się niestabilna / zepsuta, często obniża inne komponenty początkowe; na przykład jeśli programista coś zepsuje podczas zmiany mydb-dev
, klastry myws-dev
i myapp-dev
zwykle również stają się niestabilne.
Aby rozwiązać ten problem, przygotowuję propozycję strategii promocyjnej „ wyciszonej ”: wszystkie zależności między komponentami są zgodne z następującymi wytycznymi:
- Upstream zależności zależy od
DEMO
środowiska, w ich dalszym zależności, dla wszystkich ich środowiska nieprodukcyjnego (DEV
,QA
iDEMO
); i - Zależności upstream zależą od
LIVE
środowiska dla ich dalszych zależności dla środowiska produkcyjnego
Korzystając z tej konwencji, myapp-dev
aktualny wskazywałby na to myws-demo
, co by wykorzystał mydb-demo
. Podobnie myapp-qa
wskazywałby również na myws-demo
i mydb-demo
.
Zaletą, którą mogę tutaj znaleźć, jest stabilizacja kompilacji : jest znacznie mniej prawdopodobne, że DEMO
środowisko dla określonego komponentu stanie się niestabilne, ponieważ kod nie może tego zrobić DEMO
bez rygorystycznego testowania zarówno na, jak DEV
i na QA
.
Jedyną wadą, jaką mogę znaleźć w tej metodzie, jest to, że jeśli ulegnie awarii DEMO
dla konkretnego komponentu, wszystkie środowiska nieprodukcyjne dla wszystkich zależności upstream zostaną nagle uszkodzone. Ale przeciwstawiłbym się, że powinno się to zdarzać niezwykle rzadko z powodu testów przeprowadzonych na DEV
i QA
.
To dostał się problem, że wielu deweloperów (o wiele mądrzejszy i doświadczeni niż ja) rozwiązali i nie zdziwiłbym się, gdyby tego problemu i jego rozwiązania mają już imiona dla nich (oprócz tego, co ja nazywam Orchestrated / autonomicznych). Pytam więc: czy zalety strategii wyciszenia przewyższają wady i jakie wady mogę tutaj przeoczyć?