Wir haben viele Apps und Webdienste (einige öffentlich zugängliche Produkte, einige interne und Teil eines privaten "Backends"), die voneinander abhängig sind. Jede dieser Komponenten verfügt über 4 Umgebungen (Cluster von Servern / Knoten, die bestimmten Zwecken dienen):
- Nichtproduktion
DEV
- Integrierte Entwicklungsumgebung, in der CI Push-Änderungen erstellt; nützlich für Ingenieure, um schwer zu findende Fehler zu beheben, die lokal nicht reproduzierbar sindQA
- Isolierte QS / TestumgebungDEMO
- Stabile UAT-Umgebung für Geschäftsinteressenten
- Produktion
LIVE
- Unsere Live- / Produktionsumgebung
Code-Promotion lautet: LOCAL
(Entwicklermaschine) => DEV
=> QA
=> DEMO
=> LIVE
.
Angenommen, wir haben eine Anwendung namens myapp
, die von einem aufgerufenen RESTful-Webdienst unterstützt wird myws
, der selbst von einer aufgerufenen Datenbank unterstützt wird mydb
.
Derzeit haben wir unter diesen Abhängigkeiten eine so genannte " orchestrierte " Werbung: die myapp-dev
Punkte, zu myws-dev
denen sie verwendet werden mydb-dev
. Ebenso myapp-qa
Punkte, auf myws-qa
die verwendet wird mydb-qa
. Gleiches gilt für DEMO
und LIVE
.
Das Problem dabei ist, dass ich jedes Mal, wenn ich beispielsweise eine Änderung myapp
vornehme, Änderungen an myws
und mydb
auch vornehmen muss . Da jedoch jede DEV
Umgebung auf die Umgebungen ihrer Abhängigkeiten verweist DEV
, muss ich diese Änderungen alle gleichzeitig planen und einführen. Wenn ein Build instabil / defekt wird, werden häufig andere vorgelagerte Komponenten heruntergefahren. Wenn beispielsweise ein Entwickler beim Ändern etwas kaputt macht mydb-dev
, werden die myws-dev
und myapp-dev
-Cluster normalerweise auch instabil.
Um dies zu lösen, stelle ich einen Vorschlag für eine so genannte " isolierte " Werbestrategie zusammen: Alle Abhängigkeiten zwischen Komponenten folgen dieser Richtlinie:
- Upstream-Abhängigkeiten hängen von der
DEMO
Umgebung für ihre Downstream-Abhängigkeiten und für alle Nicht-Produktionsumgebungen ab (DEV
,QA
undDEMO
). und - Upstream-Abhängigkeiten hängen von der
LIVE
Umgebung für ihre Downstream-Abhängigkeiten für ihre Produktionsumgebung ab
Die Verwendung dieser Konvention myapp-dev
würde tatsächlich darauf hinweisen myws-demo
, welche verwenden würde mydb-demo
. Ebenso myapp-qa
würde auch auf myws-demo
und verweisen mydb-demo
.
Der Vorteil, den ich hier finden kann, ist die Build-Stabilisierung : Es ist viel weniger wahrscheinlich, dass die DEMO
Umgebung für eine bestimmte Komponente instabil wird, da Code es nicht DEMO
ohne strenge Tests sowohl auf DEV
als auch schafft QA
.
Der einzige Nachteil, den ich bei dieser Methode feststellen kann, ist, dass, wenn DEMO
für eine bestimmte Komponente eine Unterbrechung auftritt, plötzlich alle Nichtproduktionsumgebungen für alle vorgelagerten Abhängigkeiten unterbrochen werden. Ich würde jedoch entgegnen, dass dies aufgrund der an DEV
und durchgeführten Tests äußerst selten vorkommen sollte QA
.
Dies hat bekommt ein Problem sein , dass viele Entwickler (viel schlauer und erfahrener als ich) gelöst haben, und ich wäre nicht überrascht, wenn dieses Problem und seine Lösungen bereits Namen zu ihnen haben (außer dem, was ich rufe orchestrierte / Silo). Also frage ich: Wiegen die Vorzüge einer isolierten Werbestrategie die Nachteile auf, und welche Nachteile kann ich hier übersehen?