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ę, myappktó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-devpunkty, do myws-devktórych wykorzystuje mydb-dev. Podobnie myapp-qapunkty, do myws-qaktórych wykorzystuje mydb-qa. To samo dotyczy DEMOi LIVE.
Problem polega na tym, że w każdej chwili dokonać zmiany, powiedzmy, myappwymaga to mnie do wprowadzania zmian mywsi mydbjak 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-devi myapp-devzwykle 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,QAiDEMO); i - Zależności upstream zależą od
LIVEśrodowiska dla ich dalszych zależności dla środowiska produkcyjnego
Korzystając z tej konwencji, myapp-devaktualny wskazywałby na to myws-demo, co by wykorzystał mydb-demo. Podobnie myapp-qawskazywałby również na myws-demoi 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ć DEMObez rygorystycznego testowania zarówno na, jak DEVi na QA.
Jedyną wadą, jaką mogę znaleźć w tej metodzie, jest to, że jeśli ulegnie awarii DEMOdla 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 DEVi 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ć?