Das Wachstum der Einführung von Microservices hat zu einer Wiederbelebung der Popularität von einigen zuvor übersehenen Software-Designmustern. Viele dieser Muster stammen aus Eric Evans ‚Domain Driven Design, einem Buch, in dem es sowohl um Teamstruktur als auch um Softwarearchitektur geht.
Und von diesen Mustern ist der begrenzte Kontext vielleicht am wichtigsten zu verstehen. Als Ingenieure haben wir den begrenzten Kontext als ein Entwurfsmuster für Softwarearchitekturen betrachtet. Aber das liegt daran, dass wir es ein wenig von seiner ursprünglichen Verwendung übernommen haben. Wie von Evans verwendet, ist der begrenzte Kontext ebenso ein organisatorisches wie ein technisches Muster.
Aus diesem Grund betrachte ich das beschränkte Kontextmuster als Dreh- und Angelpunkt beim Verständnis von Microservices. Nicht nur, wie man sie baut, sondern auch, warum wir sie überhaupt bauen und wie sie unsere Organisationen erfolgreicher machen können. Wenn wir verstehen, was begrenzte Kontexte sind – wenn wir die Denkweise des begrenzten Kontexts sowohl technisch als auch organisatorisch übernehmen —, können wir beim Aufbau unserer Microservices-Architektur wirklich erfolgreich sein.
Warum auf Microservices umsteigen?
Lassen Sie uns zunächst eine kleine Übung durchführen. Stellen Sie sich diese Frage: Warum entwickeln wir Microservices überhaupt?
Nehmen Sie sich einen Moment Zeit, um darüber nachzudenken. Was sind die Vorteile, die zuerst in den Sinn kommen? Was sind die Hauptprobleme, die wir zu lösen hoffen sollten? Notieren Sie sich einige Antworten, nur um ehrlich zu bleiben.
…
Haben Sie Ihre Antwort? Gut. Lies es dir selbst vor. Haben Sie die technischen Standardvorteile erreicht? Continuous Delivery, Skalierbarkeit, polyglotte Umgebungen, Container und Clouds und all das gute Zeug? Groß.
Aber enthielt Ihre wichtigste Antwort etwas darüber, wie Sie Ihrem Unternehmen ermöglichen können, effizienter zu arbeiten? Es sollte. Denn beim Aufbau von Microservices geht es nicht darum, technische Vorteile zu realisieren. Es geht wirklich darum, organisatorische Vorteile zu erzielen. Alles andere ist ein Implementierungsdetail.
Monoliths = gekoppelter Code und gekoppelte Teams
Wenn unsere Monolithen immer größer werden, nimmt die Produktivität ab. Dafür gibt es mindestens zwei Hauptgründe.
Wir bremsen unsere Geschwindigkeit
Erstens trägt jedes Engineering-Team zu einer riesigen Codebasis bei. Daher ist es für Teams immer wahrscheinlicher, dass ihr Code mit dem Code anderer in Konflikt gerät. Um die potenziellen Probleme, die dies verursachen könnte, zu mildern, führen wir Verfahren ein — Code-Einfrieren, QA-Testperioden, Release-Züge usw. – die buchstäblich dazu bestimmt sind, unsere Produktivität zu verlangsamen.
Natürlich verhindern diese Verfahren, dass Funktionen und Verbesserungen rechtzeitig bereitgestellt werden. Sie zerstören auch die Fähigkeit der Ingenieure, sich auf die Prioritäten ihrer Teams zu konzentrieren. Wenn während eines Testzeitraums ein Fehler gefunden wird, muss sich das verantwortliche Team auf die Behebung dieses Fehlers konzentrieren. Wenn ein schwerwiegender Fehler in der Produktion gefunden wird, muss das Team den Fehler nicht nur beheben, sondern auch durch die Reifen springen, um ihn im nächsten Release-Zug bereitzustellen.
Bereitschaftsdienst wird zum Segen. Wenn mit unserem Monolithen etwas schief geht, muss jemand Tag und Nacht verfügbar sein, um das Problem zu beheben. Aber wer? Große Organisationen mit großen Monolithen stehen im Allgemeinen vor zwei Möglichkeiten:
Ein Incident-Management-Team, dessen einzige, traurige Aufgabe innerhalb der Organisation darin besteht, auf Probleme zu reagieren, die durch den Code anderer Ingenieure verursacht werden, und herauszufinden, wie sie gelöst werden können.
Ein rotierender Bereitschaftsplan, bei dem jede Woche ein beliebiger Ingenieur mit der traurigen Aufgabe betraut wird, für die Lösung von Problemen verantwortlich zu sein, die höchstwahrscheinlich durch Code verursacht werden, der von einem anderen Ingenieur in einem anderen Ingenieurteam geschrieben wurde.
(Mis)Organisation unserer Teams
Monolithen stören unsere Organisationen auf eine andere Weise. Unsere gesamte Organisation arbeitet an demselben großen Produkt. Aber wir müssen die Organisation noch in überschaubare Teams aufteilen. Daher neigen wir dazu, funktionale Rollen zu suchen, um Teamgrenzen zu finden: