Hallo, Habr! Ich prĂ€sentiere Ihnen die autorisierte Ăbersetzung des Artikels .

In einer Zeit, in der die IT-Welt allmĂ€hlich auf Mikrodienste und Werkzeuge wie Kubernetes umschaltet, wird ein Problem zunehmend sichtbar. Dieses Problem ist von Versionen der Mikrodienste. Die IT-Community glaubt jedoch, dass die heutige Situation deutlich besser ist als die der vorherigen Generation von Technologien. Dennoch ist das Versionsmanagement von Mikrodiensten ein sehr komplexes Problem. Ein Beweis dafĂŒr sind Artikel wie .
Wenn Sie diesen Text lesen und das Problem noch nicht verstehen, lassen Sie mich erklĂ€ren. Angenommen, Ihr Produkt besteht aus 10 Mikrodiensten. Nehmen wir nun an, dass fĂŒr jeden dieser Mikrodienste eine neue Version herauskommt. Nur eine Version â ich hoffe, wir können uns alle darauf einigen, dass dies ein ziemlich triviales und unbedeutendes Faktum ist. Schauen wir jedoch unser Produkt noch einmal an. Mit nur einer neuen Version jedes einzelnen Bauteils haben wir jetzt 2^10 â oder 1024 Permutationen, wie wir unser Produkt zusammenstellen können.
Falls noch Unklarheiten bestehen, lassen Sie mich die Mathematik aufschlĂŒsseln. Wir haben also 10 Mikrodienste, jeder erhĂ€lt ein Update. Das bedeutet, dass wir 2 mögliche Versionen fĂŒr jeden Mikrodienst haben (entweder die alte oder die neue). FĂŒr jedes Produktkomponente können wir nun eine dieser beiden Versionen wĂ€hlen. Mathematisch gesehen ist das dasselbe, als ob wir eine binĂ€re Zahl mit 10 Stellen hĂ€tten. Zum Beispiel, sagen wir, dass 1 die neue Version und 0 die alte Version ist â dann könnte eine mögliche Permutation als 1001000000 dargestellt werden, wobei der 1. und der 4. Komponente aktualisiert sind, wĂ€hrend alle anderen es nicht sind. Aus der Mathematik wissen wir, dass eine binĂ€re Zahl aus 10 Stellen 2^10 oder 1024 Werte haben kann. Das heiĂt, wir haben das AusmaĂ der Zahl, mit der wir es zu tun haben, bestĂ€tigt.
Lassen Sie uns weiter darĂŒber nachdenken â was passiert, wenn wir 100 Mikrodienste haben und jeder 10 mögliche Versionen? Die Situation wird Ă€uĂerst unangenehm â jetzt haben wir 10^100 Permutationen â und das ist eine gewaltige Zahl. Dennoch ziehe ich es vor, diese Situation so zu benennen, denn nun verstecken wir uns nicht hinter Worten wie âKubernetesâ, sondern begegnen dem Problem, wie es ist.
Warum fasziniert mich dieses Problem so sehr? Teilweise, weil wir vor etwa 5-6 Jahren in der Welt von NLP und KI viel ĂŒber das Problem der kombinatorischen Explosion diskutiert haben. Nur dass wir anstelle von Versionen individuelle Wörter hatten und anstelle von Produkten SĂ€tze und AbsĂ€tze. Und obwohl die Probleme von NLP und KI nach wie vor weitgehend ungelöst bleiben, muss man zugeben, dass in den letzten Jahren erhebliche Fortschritte erzielt wurden. (meiner Meinung nach könnte der Fortschritt gröĂer sein,gröĂtenwenn die Menschen in der Branche etwas weniger Aufmerksamkeit auf maschinelles Lernen und etwas mehr auf andere Techniken richten wĂŒrden â aber das ist ein anderes Thema).
Kehren wir zur Welt von DevOps und Microservices zurĂŒck. Wir stehen vor einem riesigen Problem, das sich wie ein Elefant im Raum tarnt â denn was ich oft höre, ist: âNimm einfach Kubernetes und Helm, dann wird alles gut!â. Aber nein, es wird nicht gut, wenn man alles so lĂ€sst, wie es ist. DarĂŒber hinaus scheint eine analytische Lösung dieses Problems aufgrund der KomplexitĂ€t nicht akzeptabel. Wie im NLP sollten wir uns diesem Problem zunĂ€chst durch eine Eingrenzung des Suchbereichs nĂ€hern â in diesem Fall durch den Ausschluss veralteter Permutationen.
Eine der Dinge, die helfen können, ist, dass ich letztes Jahr geschrieben habe . Es ist auch wichtig zu beachten, dass ein gut durchdachter CI/CD-Prozess sehr dafĂŒr hilfreich ist, Variationen zu reduzieren. Allerdings ist die gegenwĂ€rtige Situation mit CI/CD nicht gut genug, um das Problem der Permutationen ohne zusĂ€tzliche Tools zur Verwaltung und Verfolgung der Komponenten zu lösen.
Was wir brauchen, ist ein Experimentiersystem in der Integrationsphase, in dem wir das Risikofaktor jedes Komponente bestimmen könnten, sowie einen automatisierten Prozess zur Aktualisierung verschiedener Komponenten und Tests ohne Eingreifen des Betreibers â um zu sehen, was funktioniert und was nicht.
Ein solches Experimentiersystem könnte wie folgt aussehen:
- Entwickler schreiben Tests (das ist eine kritische Phase â denn sonst haben wir keinen BewertungsmaĂstab â es ist wie die Datenmarkierung im maschinellen Lernen).
- Jede Komponente (Projekt) erhĂ€lt ihr eigenes CI-System â dieser Prozess ist heute gut etabliert, und die Frage des Aufbaus eines CI-Systems fĂŒr eine einzelne Komponente ist weitgehend gelöst.
- Das "smarte Integrationssystem" sammelt die Ergebnisse verschiedener CI-Systeme und fasst die Projektkomponenten zu einem Endprodukt zusammen, fĂŒhrt Tests durch und berechnet schlieĂlich den direktesten Weg, um die erforderliche FunktionalitĂ€t des Produkts basierend auf verfĂŒgbaren Komponenten und Risikofaktoren zu erzielen. Wenn ein Upgrade nicht möglich ist, informiert dieses System die Entwickler ĂŒber vorhandene Komponenten und den spezifischen Fehler. Ich betone noch einmal, dass das Testsystem hier von entscheidender Bedeutung ist â da das Integrationssystem Tests als BewertungsmaĂstab verwendet.
- Das CD-System, das dann die Daten aus dem "smart Integration System" erhĂ€lt und direkt das Update durchfĂŒhrt. Diese Phase schlieĂt den Zyklus ab.
Zusammenfassend lĂ€sst sich sagen, dass eines meiner gröĂten Probleme derzeit das Fehlen eines âintelligenten Integrationssystemsâ ist, das verschiedene Komponenten innerhalb des Produkts verbindet und somit nachvollziehbar macht, wie das Produkt insgesamt zusammengesetzt ist. Mich interessieren die Gedanken der Community zu diesem Thema (Spoiler â ich arbeite gerade an einem Projekt , das ein solches intelligentes Integrationssystem werden könnte).
Eine letzte Sache, die ich erwĂ€hnen möchte â fĂŒr mich ist ein Monolith fĂŒr jedes Projekt mittlerer GröĂe nicht akzeptabel. Ich bin Ă€uĂerst skeptisch gegenĂŒber den Versuchen, die Entwicklungszeit und -qualitĂ€t durch die RĂŒckkehr zu einem Monolithen zu beschleunigen. Erstens hat der Monolith ein Ă€hnliches Problem bei der Verwaltung von Komponenten â unter den verschiedenen Bibliotheken, aus denen er besteht, ist dies jedoch nicht so offensichtlich und zeigt sich hauptsĂ€chlich in der Zeit, die die Entwickler aufwenden. Die Folge des Monolith-Problems ist die tatsĂ€chliche Unmöglichkeit, Ănderungen am Code vorzunehmen â und die extrem langsame Geschwindigkeit der Entwicklung.
Mikrodienste verbessern die Situation, jedoch steht die mikrodienstliche Architektur dann vor dem Problem der kombinatorischen Explosion in der Integrationsphase. Ja, im GroĂen und Ganzen haben wir dasselbe Problem verschoben â von der Entwicklungsphase in die Integrationsphase. Dennoch fĂŒhrt meiner Meinung nach der Ansatz der Mikrodienste zu besseren Ergebnissen, und die Teams erreichen schneller Resultate (wahrscheinlich vor allem aufgrund der verringerten GröĂe der Entwicklungseinheit â oder Batch-GröĂe). Der Ăbergang vom Monolithen zu Mikrodiensten hat jedoch bisher keinen ausreichenden Prozessverbesserung gebracht â die kombinatorische Explosion der Versionen von Mikrodiensten ist ein riesiges Problem, und wir haben ein groĂes Verbesserungspotenzial, wĂ€hrend wir dieses Problem lösen.
Quelle: habr.com
