Self-contained System vs. Vertical Slice Architecture

Auf den ersten Blick teilen Vertical Slice Architecture und Self-Contained Systems viele Gemeinsamkeiten. Es entsteht leicht der Eindruck, es handle sich lediglich um verschiedene Begriffe für denselben Ansatz. Bei genauerer Betrachtung offenbaren sich jedoch wesentliche Unterschiede. Dieser Artikel untersucht Gemeinsamkeiten und Unterschiede beider Ansätze.

Einleitung

Der Begriff ‘Vertical Slice Architecture’ wurde 2018 durch Jimmy Bogard in einem Artikel geprägt, allerdings bleiben viele Fragen offen, etwa ob Vertical Slice Architecture sich ausschließlich auf einzelne Slices innerhalb eines Deployment-Monolithen bezieht oder auch als eigenständige Form von Microservices angesehen werden kann. Weitere Autoren haben konkrete Implementierungsbeispiele formuliert (siehe https://www.milanjovanovic.tech/blog/vertical-slice-architecture-structuring-vertical-slices) und zur Verbreitung der Idee beigetragen(siehe https://medium.com/@andrew.macconnell/exploring-software-architecture-vertical-slice-789fa0a09be6), eine allgemein akzeptierte, vollständige Definition fehlt allerdings. Vertical Slice Architecture ist besonders in der .NET-Welt populär, jedoch nicht darauf beschränkt.

Self-contained System (SCS) und Vertical Slice Architecture haben Gemeinsamkeiten und Unterschiede
Self-contained System (SCS) und Vertical Slice Architecture haben Gemeinsamkeiten und Unterschiede

Self-Contained Systems wurden maßgeblich durch mehrere Veröffentlichungen und Vorträge beschrieben, in denen der Ansatz detailliert ausgearbeitet wurde. Inzwischen erfreuen sich Self-Contained Systems einer breiten Akzeptanz in der Software-Community. Eine Microsite beschreibt den Ansatz konsistent und bietet zahlreiche weiterführende Ressourcen. Ursprünglich vor allem im Java- und Spring-Boot-Umfeld verbreitet, ist der Ansatz ebenfalls technologieagnostisch.

Gemeinsamkeiten

Strukturierung

Vertical Slice Architecture und Self-Contained Systems strukturieren größere Systeme in kleinere, handhabbare Einheiten. Das schafft überschaubare, kohäsive Module entlang von fachlichen Schnitten und hilft, kognitive Last zu reduzieren.

Verwandtschaft zu Microservices

Beide Ansätze können als Spezialisierungen von Microservices betrachtet werden, die sich im Detail jedoch von Microservices unterschieden. Während Self-Contained Systems die Beziehung zu Microservices explizit und detailliert ausformulieren (siehe https://scs-architecture.org/vs-ms.html), ergibt sie sich bei Vertical Slice Architecture eher indirekt und implizit. Interessanterweise geht Bogard im grundlegenden Blogpost überhaupt nicht auf diesen Aspekt ein. In der strikten Forderung nach einer eigenen unabhängigen Codebasis divergieren Microservices und Vertical Slice Architecture voneinander.

Isolierte Geschäftslogik

Beide Ansätze fordern eine vollständige Isolation der Geschäftslogik. Dabei organisiert Vertical Slice Architecture die Logik entlang einzelner Use-Cases, während Self-Contained Systems auch mehrere zusammengehörige Use-Cases umfassen können. Sowohl Vertical Slice Architecture als auch Self-Contained Systems ermöglichen zudem optionale APIs und unterstützen polyglotte Persistenz. Insbesondere bei Vertical Slice Architecture wird dieser Aspekt durch die Herkunft im Kontext von CQRS noch stärker hervorgehoben.

Variable Technologiestacks

Des Weiteren erlauben beide Ansätze die Nutzung unterschiedlicher Technologiestacks. Self-Contained Systems fördern dies stark durch ihre physische Abgeschlossenheit, während Vertical Slice Architecture diese Flexibilität nur bei eigenständigen Deployments bietet. Ein klar definierter Scope erleichtert bei beiden Ansätzen die Trennung von Verantwortlichkeiten und fördert die Entwicklung durch autonome Teams.

Minimale Kopplung

Minimalistische Kopplung wird von beiden empfohlen, wobei Self-Contained Systems hier besonders strikt sind und explizit asynchrone Kommunikationsmechanismen bevorzugen. Beide Ansätze nutzen typischerweise Weboberflächen zur Integration, wobei dies bei Vertical Slice Architecture nicht explizit gefordert wird, aber dennoch üblich ist.

Unterschiede

Integration

Die Kommunikation zwischen Systemen unterscheidet beide Ansätze deutlich: Self-Contained Systems setzen explizit auf asynchrone Kollaboration, während Vertical Slice Architecture eine möglichst vollständige Entkopplung anstreben, Kollaboration jedoch nicht grundsätzlich ausschließen.

Self-Contained Systems formulieren zudem klare Vorgaben zur externen Kommunikation (REST oder asynchrone Messages), während Vertical Slice Architecture solche restriktiven Vorgaben weitgehend vermeiden. Bei Self-Contained Systems besitzt jede Einheit eine eigene UI, bei Vertical Slice Architecture teilen sich die Slices oft eine gemeinsame Benutzeroberfläche und bieten Controller zur Behandlung externer Ereignisse.

Ein wesentlicher Unterschied betrifft die gemeinsam genutzte Infrastruktur. Self-Contained Systems versuchen, die gemeinsame Nutzung von Infrastruktur weitgehend zu vermeiden, während Vertical Slice Architecture dies ausdrücklich zulassen.

Deployment und Modularisierung

Ein weiterer Unterschied liegt im Deployment. Self-Contained Systems werden stets eigenständig deployt, während Vertical Slice Architecture sowohl innerhalb modularer Monolithen als auch eigenständig betrieben werden können.

Auch hinsichtlich der fachlichen Ausrichtung zeigen sich Unterschiede: Self-Contained Systems strukturieren Systeme anhand fachlicher Domänen, während Vertical Slice Architecture strikt auf Features fokussieren, was sowohl zu feineren als auch domänenübergreifenden Modulen führen kann.

Bezüglich der Skalierung bieten Self-Contained Systems aufgrund ihrer Eigenständigkeit stets individuelle Skalierbarkeit, Vertical Slice Architecture ermöglicht dies nur, wenn Slices eigenständig deployt werden.

Persistenz

Self-Contained Systems verwenden jeweils eigene, isolierte Datenhaltungssysteme, während Vertical Slice Architecture die gemeinsame Datenhaltung erlauben. Darüber hinaus bestehen Differenzen bei der Datenhoheit: Self-Contained Systems fordern explizit eine klare Datenhoheit durch ein führendes System, während Vertical Slice Architecture hier keine klaren Vorgaben machen.

Greenfield und System Modernisierung

Self-Contained Systems eignen sich sowohl explizit für die Entwicklung neuer Systeme (Greenfield) als auch zur Modernisierung bestehender Systeme durch schrittweise Zerlegung in modulare Teilsysteme. Vertical Slices fokussieren dagegen stärker auf schnelle Feature-Entwicklung und behandeln Modernisierungsaspekte nicht explizit, obwohl sie auch hierzu prinzipiell geeignet sind.

Fazit

Obwohl die Unterschiede zwischen Self-Contained Systems und Vertical Slice Architecture zahlreich sind, adressieren beide Ansätze ähnliche Herausforderungen in der Softwarearchitektur. Self-Contained Systems sind streng definiert und strukturiert, während Vertical Slice Architecture pragmatisch und weniger formal sind. Dies macht Vertical Slice Architecture einerseits zugänglicher, kann aber auch die Einstiegshürde aufgrund mangelnder eindeutiger Definitionen erhöhen. Im Zweifel lassen sich die hier aufgeführten Charakteristiken durch leichte Variationen in der Umsetzung an individuelle Anforderungen anpassen.

Die Wahl des passenden Ansatzes hängt von individuellen Faktoren ab: Wo Abgeschlossenheit und isolierte Deploybarkeit entscheidend sind, bieten sich Self-Contained Systems an. Für Feature-getriebene Entwicklungen kann Vertical Slice Architecture eine pragmatische Wahl sein. Dabei ist jedoch zu beachten, dass mit zunehmender Anzahl von Slices die Komplexität des Gesamtsystems wächst.

Wie immer gilt auch hier bei der Architekturarbeit: Nur wenn die spezifischen Randbedingungen und wesentlichen Qualitätsmerkmale im individuellen Kontext bekannt sind, können wir gute Architekturentscheidungen treffen. In jedem Fall gehören Vertical Slice Architecture und Self-contained Systems in den Werkzeugkasten bei der Architekturarbeit.